Lines Matching refs:relocator

120 static kern_return_t generic_process_reloc(const KXLDRelocator *relocator,
133 static kern_return_t x86_64_process_reloc(const KXLDRelocator *relocator,
148 static kern_return_t arm_process_reloc(const KXLDRelocator *relocator,
161 static kern_return_t arm64_process_reloc(const KXLDRelocator *relocator,
168 static kxld_addr_t get_pointer_at_addr_32(const KXLDRelocator *relocator,
173 static kxld_addr_t get_pointer_at_addr_64(const KXLDRelocator *relocator,
178 static u_int count_relocatable_relocs(const KXLDRelocator *relocator,
182 static kern_return_t calculate_targets(KXLDRelocator *relocator,
185 static kxld_addr_t align_raw_function_address(const KXLDRelocator *relocator,
192 const KXLDRelocator *relocator, u_long offset);
197 static kern_return_t export_macho_for_array(const KXLDRelocator *relocator,
204 kxld_relocator_init(KXLDRelocator *relocator, u_char *file,
210 check(relocator);
215 relocator->reloc_has_pair = generic_reloc_has_pair;
216 relocator->reloc_get_pair_type = generic_reloc_get_pair_type;
217 relocator->reloc_has_got = generic_reloc_has_got;
218 relocator->process_reloc = generic_process_reloc;
219 relocator->function_align = 0;
220 relocator->is_32_bit = TRUE;
221 relocator->may_scatter = TRUE;
226 relocator->reloc_has_pair = x86_64_reloc_has_pair;
227 relocator->reloc_get_pair_type = x86_64_reloc_get_pair_type;
228 relocator->reloc_has_got = x86_64_reloc_has_got;
229 relocator->process_reloc = x86_64_process_reloc;
230 relocator->function_align = 0;
231 relocator->is_32_bit = FALSE;
232 relocator->may_scatter = FALSE;
237 relocator->reloc_has_pair = arm_reloc_has_pair;
238 relocator->reloc_get_pair_type = arm_reloc_get_pair_type;
239 relocator->reloc_has_got = arm_reloc_has_got;
240 relocator->process_reloc = arm_process_reloc;
241 relocator->function_align = 1;
242 relocator->is_32_bit = TRUE;
243 relocator->may_scatter = FALSE;
248 relocator->reloc_has_pair = arm64_reloc_has_pair;
249 relocator->reloc_get_pair_type = arm64_reloc_get_pair_type;
250 relocator->reloc_has_got = arm64_reloc_has_got;
251 relocator->process_reloc = arm64_process_reloc;
252 relocator->function_align = 0;
253 relocator->is_32_bit = FALSE;
254 relocator->may_scatter = FALSE;
265 relocator->file = file;
266 relocator->symtab = symtab;
267 relocator->sectarray = sectarray;
268 relocator->is_32_bit = kxld_is_32_bit(cputype);
269 relocator->swap = swap;
280 kxld_reloc_create_macho(KXLDArray *relocarray, const KXLDRelocator *relocator,
301 nrelocs = count_relocatable_relocs(relocator, srcs, nsrcs);
320 if (!(relocator->may_scatter && (src->r_address & R_SCATTERED)) &&
333 if (relocator->may_scatter && (src->r_address & R_SCATTERED)) {
357 if (relocator->reloc_has_pair(reloc->reloc_type)) {
364 if (relocator->may_scatter && (src->r_address & R_SCATTERED)) {
365 require_action(relocator->reloc_get_pair_type(
372 require_action(relocator->reloc_get_pair_type(
386 if (relocator->reloc_has_got(reloc->reloc_type)) {
408 count_relocatable_relocs(const KXLDRelocator *relocator,
416 check(relocator);
432 !relocator->reloc_has_pair(sreloc->r_type);
438 !(relocator->reloc_has_pair(reloc->r_type)
450 kxld_relocator_clear(KXLDRelocator *relocator)
452 bzero(relocator, sizeof(*relocator));
458 kxld_relocator_has_pair(const KXLDRelocator *relocator, u_int r_type)
460 check(relocator);
462 return relocator->reloc_has_pair(r_type);
468 kxld_relocator_get_pair_type(const KXLDRelocator *relocator,
471 check(relocator);
473 return relocator->reloc_get_pair_type(prev_r_type);
479 kxld_relocator_has_got(const KXLDRelocator *relocator, u_int r_type)
481 check(relocator);
483 return relocator->reloc_has_got(r_type);
489 kxld_reloc_get_symbol(const KXLDRelocator *relocator, const KXLDReloc *reloc,
499 sym = kxld_symtab_get_symbol_by_index(relocator->symtab, reloc->target);
503 value = kxld_relocator_get_pointer_at_addr(relocator, data,
505 sym = kxld_symtab_get_cxx_symbol_by_value(relocator->symtab, value);
587 kxld_reloc_export_macho(const KXLDRelocator *relocator,
614 rval = export_macho_for_array(relocator, locrelocs, &dst);
617 rval = export_macho_for_array(relocator, extrelocs, &dst);
639 kxld_relocator_get_pointer_at_addr(const KXLDRelocator *relocator,
644 KXLD_3264_FUNC(relocator->is_32_bit, value,
646 relocator, data, offset);
655 get_pointer_at_addr_32(const KXLDRelocator *relocator,
660 check(relocator);
664 if (relocator->swap) {
669 return align_raw_function_address(relocator, addr);
677 get_pointer_at_addr_64(const KXLDRelocator *relocator,
682 check(relocator);
686 if (relocator->swap) {
691 return align_raw_function_address(relocator, addr);
698 kxld_relocator_set_vtables(KXLDRelocator *relocator, const KXLDDict *vtables)
700 relocator->vtables = vtables;
711 align_raw_function_address(const KXLDRelocator *relocator, kxld_addr_t value)
713 if (relocator->function_align) {
714 value &= ~((1ULL << relocator->function_align) - 1);
723 kxld_relocator_process_sect_reloc(KXLDRelocator *relocator,
734 check(relocator);
744 rval = calculate_targets(relocator, &target, &pair_target, reloc);
753 rval = relocator->process_reloc(relocator, instruction, reloc->length,
755 pair_target, relocator->swap);
760 relocator->current_vtable = NULL;
788 kxld_relocator_process_table_reloc(KXLDRelocator *relocator,
799 check(relocator);
805 instruction = relocator->file + offset;
809 rval = calculate_targets(relocator, &target, &pair_target, reloc);
817 rval = relocator->process_reloc(relocator, instruction, reloc->length,
819 pair_target, relocator->swap);
824 relocator->current_vtable = NULL;
834 calculate_targets(KXLDRelocator *relocator, kxld_addr_t *_target,
860 relocator->sectarray);
865 reloc->pair_target, relocator->sectarray);
877 sect = kxld_array_get_item(relocator->sectarray, reloc->target);
900 sym = kxld_symtab_get_symbol_by_index(relocator->symtab, reloc->target);
918 relocator->current_vtable = kxld_dict_find(relocator->vtables, sym->name);
928 sym = kxld_symtab_get_symbol_by_index(relocator->symtab,
987 check_for_direct_pure_virtual_call(const KXLDRelocator *relocator, u_long offset)
992 if (relocator->current_vtable) {
993 entry = kxld_vtable_get_entry_for_offset(relocator->current_vtable,
994 offset, relocator->is_32_bit);
1035 export_macho_for_array(const KXLDRelocator *relocator,
1098 scatdst->r_type = relocator->reloc_get_pair_type(reloc->reloc_type);
1106 dst->r_type = relocator->reloc_get_pair_type(reloc->reloc_type);
1114 dst->r_type = relocator->reloc_get_pair_type(reloc->reloc_type);
1163 generic_process_reloc(const KXLDRelocator *relocator, u_char *instruction,
1189 rval = check_for_direct_pure_virtual_call(relocator, instr_data);
1254 x86_64_process_reloc(const KXLDRelocator *relocator __unused, u_char *instruction,
1283 rval = check_for_direct_pure_virtual_call(relocator, instr32);
1385 rval = check_for_direct_pure_virtual_call(relocator, (u_long) instr64);
1484 arm_process_reloc(const KXLDRelocator *relocator __unused, u_char *instruction,
1511 rval = check_for_direct_pure_virtual_call(relocator, instr_data);
1597 arm64_process_reloc(const KXLDRelocator *relocator __unused, u_char *instruction,