Lines Matching defs:relocator

117 static kern_return_t generic_process_reloc(const KXLDRelocator *relocator,
130 static kern_return_t x86_64_process_reloc(const KXLDRelocator *relocator,
145 static kern_return_t arm_process_reloc(const KXLDRelocator *relocator,
152 static kxld_addr_t get_pointer_at_addr_32(const KXLDRelocator *relocator,
157 static kxld_addr_t get_pointer_at_addr_64(const KXLDRelocator *relocator,
162 static u_int count_relocatable_relocs(const KXLDRelocator *relocator,
166 static kern_return_t calculate_targets(KXLDRelocator *relocator,
169 static kxld_addr_t align_raw_function_address(const KXLDRelocator *relocator,
176 const KXLDRelocator *relocator, u_long offset);
181 static kern_return_t export_macho_for_array(const KXLDRelocator *relocator,
188 kxld_relocator_init(KXLDRelocator *relocator, u_char *file,
194 check(relocator);
199 relocator->reloc_has_pair = generic_reloc_has_pair;
200 relocator->reloc_get_pair_type = generic_reloc_get_pair_type;
201 relocator->reloc_has_got = generic_reloc_has_got;
202 relocator->process_reloc = generic_process_reloc;
203 relocator->function_align = 0;
204 relocator->is_32_bit = TRUE;
205 relocator->may_scatter = TRUE;
210 relocator->reloc_has_pair = x86_64_reloc_has_pair;
211 relocator->reloc_get_pair_type = x86_64_reloc_get_pair_type;
212 relocator->reloc_has_got = x86_64_reloc_has_got;
213 relocator->process_reloc = x86_64_process_reloc;
214 relocator->function_align = 0;
215 relocator->is_32_bit = FALSE;
216 relocator->may_scatter = FALSE;
221 relocator->reloc_has_pair = arm_reloc_has_pair;
222 relocator->reloc_get_pair_type = arm_reloc_get_pair_type;
223 relocator->reloc_has_got = arm_reloc_has_got;
224 relocator->process_reloc = arm_process_reloc;
225 relocator->function_align = 1;
226 relocator->is_32_bit = TRUE;
227 relocator->may_scatter = FALSE;
237 relocator->file = file;
238 relocator->symtab = symtab;
239 relocator->sectarray = sectarray;
240 relocator->is_32_bit = kxld_is_32_bit(cputype);
241 relocator->swap = swap;
252 kxld_reloc_create_macho(KXLDArray *relocarray, const KXLDRelocator *relocator,
273 nrelocs = count_relocatable_relocs(relocator, srcs, nsrcs);
292 if (!(relocator->may_scatter && (src->r_address & R_SCATTERED)) &&
305 if (relocator->may_scatter && (src->r_address & R_SCATTERED)) {
329 if (relocator->reloc_has_pair(reloc->reloc_type)) {
336 if (relocator->may_scatter && (src->r_address & R_SCATTERED)) {
337 require_action(relocator->reloc_get_pair_type(
344 require_action(relocator->reloc_get_pair_type(
358 if (relocator->reloc_has_got(reloc->reloc_type)) {
380 count_relocatable_relocs(const KXLDRelocator *relocator,
388 check(relocator);
404 !relocator->reloc_has_pair(sreloc->r_type);
410 !(relocator->reloc_has_pair(reloc->r_type)
422 kxld_relocator_clear(KXLDRelocator *relocator)
424 bzero(relocator, sizeof(*relocator));
430 kxld_relocator_has_pair(const KXLDRelocator *relocator, u_int r_type)
432 check(relocator);
434 return relocator->reloc_has_pair(r_type);
440 kxld_relocator_get_pair_type(const KXLDRelocator *relocator,
443 check(relocator);
445 return relocator->reloc_get_pair_type(prev_r_type);
451 kxld_relocator_has_got(const KXLDRelocator *relocator, u_int r_type)
453 check(relocator);
455 return relocator->reloc_has_got(r_type);
461 kxld_reloc_get_symbol(const KXLDRelocator *relocator, const KXLDReloc *reloc,
471 sym = kxld_symtab_get_symbol_by_index(relocator->symtab, reloc->target);
475 value = kxld_relocator_get_pointer_at_addr(relocator, data,
477 sym = kxld_symtab_get_cxx_symbol_by_value(relocator->symtab, value);
559 kxld_reloc_export_macho(const KXLDRelocator *relocator,
586 rval = export_macho_for_array(relocator, locrelocs, &dst);
589 rval = export_macho_for_array(relocator, extrelocs, &dst);
611 kxld_relocator_get_pointer_at_addr(const KXLDRelocator *relocator,
616 KXLD_3264_FUNC(relocator->is_32_bit, value,
618 relocator, data, offset);
627 get_pointer_at_addr_32(const KXLDRelocator *relocator,
632 check(relocator);
636 if (relocator->swap) {
641 return align_raw_function_address(relocator, addr);
649 get_pointer_at_addr_64(const KXLDRelocator *relocator,
654 check(relocator);
658 if (relocator->swap) {
663 return align_raw_function_address(relocator, addr);
670 kxld_relocator_set_vtables(KXLDRelocator *relocator, const KXLDDict *vtables)
672 relocator->vtables = vtables;
683 align_raw_function_address(const KXLDRelocator *relocator, kxld_addr_t value)
685 if (relocator->function_align) {
686 value &= ~((1ULL << relocator->function_align) - 1);
695 kxld_relocator_process_sect_reloc(KXLDRelocator *relocator,
706 check(relocator);
716 rval = calculate_targets(relocator, &target, &pair_target, reloc);
725 rval = relocator->process_reloc(relocator, instruction, reloc->length,
727 pair_target, relocator->swap);
732 relocator->current_vtable = NULL;
760 kxld_relocator_process_table_reloc(KXLDRelocator *relocator,
771 check(relocator);
777 instruction = relocator->file + offset;
781 rval = calculate_targets(relocator, &target, &pair_target, reloc);
789 rval = relocator->process_reloc(relocator, instruction, reloc->length,
791 pair_target, relocator->swap);
796 relocator->current_vtable = NULL;
806 calculate_targets(KXLDRelocator *relocator, kxld_addr_t *_target,
832 relocator->sectarray);
837 reloc->pair_target, relocator->sectarray);
849 sect = kxld_array_get_item(relocator->sectarray, reloc->target);
872 sym = kxld_symtab_get_symbol_by_index(relocator->symtab, reloc->target);
890 relocator->current_vtable = kxld_dict_find(relocator->vtables, sym->name);
900 sym = kxld_symtab_get_symbol_by_index(relocator->symtab,
959 check_for_direct_pure_virtual_call(const KXLDRelocator *relocator, u_long offset)
964 if (relocator->current_vtable) {
965 entry = kxld_vtable_get_entry_for_offset(relocator->current_vtable,
966 offset, relocator->is_32_bit);
1007 export_macho_for_array(const KXLDRelocator *relocator,
1070 scatdst->r_type = relocator->reloc_get_pair_type(reloc->reloc_type);
1078 dst->r_type = relocator->reloc_get_pair_type(reloc->reloc_type);
1086 dst->r_type = relocator->reloc_get_pair_type(reloc->reloc_type);
1135 generic_process_reloc(const KXLDRelocator *relocator, u_char *instruction,
1161 rval = check_for_direct_pure_virtual_call(relocator, instr_data);
1226 x86_64_process_reloc(const KXLDRelocator *relocator __unused, u_char *instruction,
1255 rval = check_for_direct_pure_virtual_call(relocator, instr32);
1357 rval = check_for_direct_pure_virtual_call(relocator, (u_long) instr64);
1456 arm_process_reloc(const KXLDRelocator *relocator __unused, u_char *instruction,
1483 rval = check_for_direct_pure_virtual_call(relocator, instr_data);