Lines Matching defs:reloc

67 #include <mach-o/reloc.h>
69 #include <mach-o/x86_64/reloc.h>
72 #include <mach-o/arm/reloc.h>
75 #include <mach-o/arm64/reloc.h>
183 kxld_addr_t *_target, kxld_addr_t *_pair_target, const KXLDReloc *reloc);
284 KXLDReloc *reloc = NULL;
332 reloc = kxld_array_get_item(relocarray, reloc_index++);
334 reloc->address = scatsrc->r_address;
335 reloc->pcrel = scatsrc->r_pcrel;
336 reloc->length = scatsrc->r_length;
337 reloc->reloc_type = scatsrc->r_type;
338 reloc->target = scatsrc->r_value;
339 reloc->target_type = KXLD_TARGET_LOOKUP;
341 reloc->address = src->r_address;
342 reloc->pcrel = src->r_pcrel;
343 reloc->length = src->r_length;
344 reloc->reloc_type = src->r_type;
345 reloc->target = src->r_symbolnum;
348 reloc->target_type = KXLD_TARGET_SECTNUM;
349 reloc->target -= 1;
351 reloc->target_type = KXLD_TARGET_SYMBOLNUM;
357 if (relocator->reloc_has_pair(reloc->reloc_type)) {
366 reloc->reloc_type) == scatsrc->r_type,
368 reloc->pair_address= scatsrc->r_address;
369 reloc->pair_target = scatsrc->r_value;
370 reloc->pair_target_type = KXLD_TARGET_LOOKUP;
373 reloc->reloc_type) == scatsrc->r_type,
375 reloc->pair_address = scatsrc->r_address;
377 reloc->pair_target = src->r_symbolnum;
378 reloc->pair_target_type = KXLD_TARGET_SYMBOLNUM;
380 reloc->pair_target = src->r_address;
381 reloc->pair_target_type = KXLD_TARGET_VALUE;
385 reloc->pair_target = 0;
386 if (relocator->reloc_has_got(reloc->reloc_type)) {
387 reloc->pair_target_type = KXLD_TARGET_GOT;
389 reloc->pair_target_type = KXLD_TARGET_NONE;
413 const struct relocation_info *reloc = NULL;
423 reloc = relocs + i;
425 if (reloc->r_address & R_SCATTERED) {
429 sreloc = (const struct scattered_relocation_info *) reloc;
438 !(relocator->reloc_has_pair(reloc->r_type)
439 || (0 == reloc->r_extern && R_ABS == reloc->r_symbolnum));
489 kxld_reloc_get_symbol(const KXLDRelocator *relocator, const KXLDReloc *reloc,
495 check(reloc);
497 switch (reloc->target_type) {
499 sym = kxld_symtab_get_symbol_by_index(relocator->symtab, reloc->target);
504 reloc->address);
523 KXLDReloc *reloc = NULL;
527 reloc = kxld_array_get_item(relocs, i);
528 if (reloc->address == offset) break;
549 KXLDReloc *reloc = NULL;
555 reloc = kxld_array_get_item(relocs, i);
558 return reloc;
724 const KXLDReloc *reloc, const KXLDSect *sect)
735 check(reloc);
740 instruction = sect->data + reloc->address;
744 rval = calculate_targets(relocator, &target, &pair_target, reloc);
747 base_pc = reloc->address;
753 rval = relocator->process_reloc(relocator, instruction, reloc->length,
754 reloc->pcrel, base_pc, link_pc, link_disp, reloc->reloc_type, target,
770 kxld_reloc_update_symindex(KXLDReloc *reloc, u_int symindex)
774 require_action(reloc->target_type == KXLD_TARGET_SYMBOLNUM,
777 reloc->target = symindex;
789 const KXLDReloc *reloc, const KXLDSeg *seg, kxld_addr_t link_addr)
800 check(reloc);
804 offset = (u_long)(seg->fileoff + (reloc->address - seg->base_addr));
809 rval = calculate_targets(relocator, &target, &pair_target, reloc);
812 base_pc = reloc->address;
817 rval = relocator->process_reloc(relocator, instruction, reloc->length,
818 reloc->pcrel, base_pc, link_pc, link_addr, reloc->reloc_type, target,
835 kxld_addr_t *_pair_target, const KXLDReloc *reloc)
852 switch(reloc->target_type) {
854 require_action(reloc->pair_target_type == KXLD_TARGET_NONE ||
855 reloc->pair_target_type == KXLD_TARGET_LOOKUP ||
856 reloc->pair_target_type == KXLD_TARGET_VALUE,
859 rval = get_target_by_address_lookup(&target, reloc->target,
863 if (reloc->pair_target_type == KXLD_TARGET_LOOKUP) {
865 reloc->pair_target, relocator->sectarray);
867 } else if (reloc->pair_target_type == KXLD_TARGET_VALUE) {
868 pair_target = reloc->pair_target;
872 require_action(reloc->pair_target_type == KXLD_TARGET_NONE ||
873 reloc->pair_target_type == KXLD_TARGET_VALUE,
877 sect = kxld_array_get_item(relocator->sectarray, reloc->target);
883 if (reloc->pair_target_type) {
884 pair_target = reloc->pair_target;
893 require_action(reloc->pair_target_type == KXLD_TARGET_NONE ||
894 reloc->pair_target_type == KXLD_TARGET_GOT ||
895 reloc->pair_target_type == KXLD_TARGET_SYMBOLNUM ||
896 reloc->pair_target_type == KXLD_TARGET_VALUE, finish,
900 sym = kxld_symtab_get_symbol_by_index(relocator->symtab, reloc->target);
925 if (reloc->pair_target_type == KXLD_TARGET_VALUE) {
926 pair_target = reloc->pair_target;
927 } else if (reloc->pair_target_type == KXLD_TARGET_SYMBOLNUM ) {
929 reloc->pair_target);
932 } else if (reloc->pair_target_type == KXLD_TARGET_GOT) {
1013 const KXLDReloc *reloc = NULL;
1020 reloc = kxld_array_get_item(relocs, i);
1021 if (!reloc->pcrel) {
1023 if(reloc->pair_target_type != KXLD_TARGET_NONE) {
1039 const KXLDReloc *reloc = NULL;
1047 reloc = kxld_array_get_item(relocs, i);
1050 if (reloc->pcrel) {
1054 switch (reloc->target_type) {
1056 scatdst->r_address = reloc->address;
1057 scatdst->r_pcrel = reloc->pcrel;
1058 scatdst->r_length = reloc->length;
1059 scatdst->r_type = reloc->reloc_type;
1060 scatdst->r_value = reloc->target;
1064 dst->r_address = reloc->address;
1065 dst->r_pcrel = reloc->pcrel;
1066 dst->r_length = reloc->length;
1067 dst->r_type = reloc->reloc_type;
1068 dst->r_symbolnum = reloc->target + 1;
1075 dst->r_address = reloc->address;
1076 dst->r_pcrel = reloc->pcrel;
1077 dst->r_length = reloc->length;
1078 dst->r_type = reloc->reloc_type;
1089 if(reloc->pair_target_type != KXLD_TARGET_NONE) {
1093 switch (reloc->pair_target_type) {
1095 scatdst->r_address = reloc->pair_address;
1096 scatdst->r_pcrel = reloc->pcrel;
1097 scatdst->r_length = reloc->length;
1098 scatdst->r_type = relocator->reloc_get_pair_type(reloc->reloc_type);
1099 scatdst->r_value = reloc->pair_target;
1103 dst->r_address = reloc->pair_address;
1104 dst->r_pcrel = reloc->pcrel;
1105 dst->r_length = reloc->length;
1106 dst->r_type = relocator->reloc_get_pair_type(reloc->reloc_type);
1107 dst->r_symbolnum = reloc->pair_target + 1;
1111 dst->r_address = reloc->pair_address;
1112 dst->r_pcrel = reloc->pcrel;
1113 dst->r_length = reloc->length;
1114 dst->r_type = relocator->reloc_get_pair_type(reloc->reloc_type);