Lines Matching refs:reloc

67 #include <mach-o/reloc.h>
69 #include <mach-o/x86_64/reloc.h>
72 #include <mach-o/arm/reloc.h>
167 kxld_addr_t *_target, kxld_addr_t *_pair_target, const KXLDReloc *reloc);
256 KXLDReloc *reloc = NULL;
304 reloc = kxld_array_get_item(relocarray, reloc_index++);
306 reloc->address = scatsrc->r_address;
307 reloc->pcrel = scatsrc->r_pcrel;
308 reloc->length = scatsrc->r_length;
309 reloc->reloc_type = scatsrc->r_type;
310 reloc->target = scatsrc->r_value;
311 reloc->target_type = KXLD_TARGET_LOOKUP;
313 reloc->address = src->r_address;
314 reloc->pcrel = src->r_pcrel;
315 reloc->length = src->r_length;
316 reloc->reloc_type = src->r_type;
317 reloc->target = src->r_symbolnum;
320 reloc->target_type = KXLD_TARGET_SECTNUM;
321 reloc->target -= 1;
323 reloc->target_type = KXLD_TARGET_SYMBOLNUM;
329 if (relocator->reloc_has_pair(reloc->reloc_type)) {
338 reloc->reloc_type) == scatsrc->r_type,
340 reloc->pair_address= scatsrc->r_address;
341 reloc->pair_target = scatsrc->r_value;
342 reloc->pair_target_type = KXLD_TARGET_LOOKUP;
345 reloc->reloc_type) == scatsrc->r_type,
347 reloc->pair_address = scatsrc->r_address;
349 reloc->pair_target = src->r_symbolnum;
350 reloc->pair_target_type = KXLD_TARGET_SYMBOLNUM;
352 reloc->pair_target = src->r_address;
353 reloc->pair_target_type = KXLD_TARGET_VALUE;
357 reloc->pair_target = 0;
358 if (relocator->reloc_has_got(reloc->reloc_type)) {
359 reloc->pair_target_type = KXLD_TARGET_GOT;
361 reloc->pair_target_type = KXLD_TARGET_NONE;
385 const struct relocation_info *reloc = NULL;
395 reloc = relocs + i;
397 if (reloc->r_address & R_SCATTERED) {
401 sreloc = (const struct scattered_relocation_info *) reloc;
410 !(relocator->reloc_has_pair(reloc->r_type)
411 || (0 == reloc->r_extern && R_ABS == reloc->r_symbolnum));
461 kxld_reloc_get_symbol(const KXLDRelocator *relocator, const KXLDReloc *reloc,
467 check(reloc);
469 switch (reloc->target_type) {
471 sym = kxld_symtab_get_symbol_by_index(relocator->symtab, reloc->target);
476 reloc->address);
495 KXLDReloc *reloc = NULL;
499 reloc = kxld_array_get_item(relocs, i);
500 if (reloc->address == offset) break;
521 KXLDReloc *reloc = NULL;
527 reloc = kxld_array_get_item(relocs, i);
530 return reloc;
696 const KXLDReloc *reloc, const KXLDSect *sect)
707 check(reloc);
712 instruction = sect->data + reloc->address;
716 rval = calculate_targets(relocator, &target, &pair_target, reloc);
719 base_pc = reloc->address;
725 rval = relocator->process_reloc(relocator, instruction, reloc->length,
726 reloc->pcrel, base_pc, link_pc, link_disp, reloc->reloc_type, target,
742 kxld_reloc_update_symindex(KXLDReloc *reloc, u_int symindex)
746 require_action(reloc->target_type == KXLD_TARGET_SYMBOLNUM,
749 reloc->target = symindex;
761 const KXLDReloc *reloc, const KXLDSeg *seg, kxld_addr_t link_addr)
772 check(reloc);
776 offset = (u_long)(seg->fileoff + (reloc->address - seg->base_addr));
781 rval = calculate_targets(relocator, &target, &pair_target, reloc);
784 base_pc = reloc->address;
789 rval = relocator->process_reloc(relocator, instruction, reloc->length,
790 reloc->pcrel, base_pc, link_pc, link_addr, reloc->reloc_type, target,
807 kxld_addr_t *_pair_target, const KXLDReloc *reloc)
824 switch(reloc->target_type) {
826 require_action(reloc->pair_target_type == KXLD_TARGET_NONE ||
827 reloc->pair_target_type == KXLD_TARGET_LOOKUP ||
828 reloc->pair_target_type == KXLD_TARGET_VALUE,
831 rval = get_target_by_address_lookup(&target, reloc->target,
835 if (reloc->pair_target_type == KXLD_TARGET_LOOKUP) {
837 reloc->pair_target, relocator->sectarray);
839 } else if (reloc->pair_target_type == KXLD_TARGET_VALUE) {
840 pair_target = reloc->pair_target;
844 require_action(reloc->pair_target_type == KXLD_TARGET_NONE ||
845 reloc->pair_target_type == KXLD_TARGET_VALUE,
849 sect = kxld_array_get_item(relocator->sectarray, reloc->target);
855 if (reloc->pair_target_type) {
856 pair_target = reloc->pair_target;
865 require_action(reloc->pair_target_type == KXLD_TARGET_NONE ||
866 reloc->pair_target_type == KXLD_TARGET_GOT ||
867 reloc->pair_target_type == KXLD_TARGET_SYMBOLNUM ||
868 reloc->pair_target_type == KXLD_TARGET_VALUE, finish,
872 sym = kxld_symtab_get_symbol_by_index(relocator->symtab, reloc->target);
897 if (reloc->pair_target_type == KXLD_TARGET_VALUE) {
898 pair_target = reloc->pair_target;
899 } else if (reloc->pair_target_type == KXLD_TARGET_SYMBOLNUM ) {
901 reloc->pair_target);
904 } else if (reloc->pair_target_type == KXLD_TARGET_GOT) {
985 const KXLDReloc *reloc = NULL;
992 reloc = kxld_array_get_item(relocs, i);
993 if (!reloc->pcrel) {
995 if(reloc->pair_target_type != KXLD_TARGET_NONE) {
1011 const KXLDReloc *reloc = NULL;
1019 reloc = kxld_array_get_item(relocs, i);
1022 if (reloc->pcrel) {
1026 switch (reloc->target_type) {
1028 scatdst->r_address = reloc->address;
1029 scatdst->r_pcrel = reloc->pcrel;
1030 scatdst->r_length = reloc->length;
1031 scatdst->r_type = reloc->reloc_type;
1032 scatdst->r_value = reloc->target;
1036 dst->r_address = reloc->address;
1037 dst->r_pcrel = reloc->pcrel;
1038 dst->r_length = reloc->length;
1039 dst->r_type = reloc->reloc_type;
1040 dst->r_symbolnum = reloc->target + 1;
1047 dst->r_address = reloc->address;
1048 dst->r_pcrel = reloc->pcrel;
1049 dst->r_length = reloc->length;
1050 dst->r_type = reloc->reloc_type;
1061 if(reloc->pair_target_type != KXLD_TARGET_NONE) {
1065 switch (reloc->pair_target_type) {
1067 scatdst->r_address = reloc->pair_address;
1068 scatdst->r_pcrel = reloc->pcrel;
1069 scatdst->r_length = reloc->length;
1070 scatdst->r_type = relocator->reloc_get_pair_type(reloc->reloc_type);
1071 scatdst->r_value = reloc->pair_target;
1075 dst->r_address = reloc->pair_address;
1076 dst->r_pcrel = reloc->pcrel;
1077 dst->r_length = reloc->length;
1078 dst->r_type = relocator->reloc_get_pair_type(reloc->reloc_type);
1079 dst->r_symbolnum = reloc->pair_target + 1;
1083 dst->r_address = reloc->pair_address;
1084 dst->r_pcrel = reloc->pcrel;
1085 dst->r_length = reloc->length;
1086 dst->r_type = relocator->reloc_get_pair_type(reloc->reloc_type);