@@ -908,17 +908,15 @@ void MachObj_term(const(char)[] objfilename)
908908 r.rtype == RELadd ? " add" :
909909 " rel" ;
910910 // printf("%d:x%04llx : targseg %d targsym %s REL%s flag %d\n", seg, r.offset, r.targseg, s ? s.Sident.ptr : "0", rs, r.flag);
911- // bool isPersonality = strcmp(s.Sident.ptr, "__dmd_personality_v0") == 0 ||
912- // strcmp(s.Sident.ptr, "___dmd_personality_v0") == 0; // temporary scaffolding
913- // symbol_print(*s);
911+ // bool isPersonality = strcmp(s.Sident.ptr, "__dmd_personality_v0") == 0 ||
912+ // strcmp(s.Sident.ptr, "___dmd_personality_v0") == 0; // temporary scaffolding
913+ // symbol_print(*s);
914914 relocation_info rel;
915915 scattered_relocation_info srel;
916916 if (machobj.AArch64)
917917 {
918918 if (s)
919919 {
920- // printf("Relocation\n");
921- // symbol_print(*s);
922920 if (r.flag == 1 ) // emit SUBTRACTOR/UNSIGNED pair
923921 {
924922 // printf("rel1\n");
@@ -1056,12 +1054,16 @@ void MachObj_term(const(char)[] objfilename)
10561054 rel.r_address = cast (int )r.offset;
10571055 rel.r_symbolnum = s.Sseg;
10581056 rel.r_pcrel = 0 ;
1059- rel.r_length = 2 ; // 3?
1057+ rel.r_length = 3 ;
10601058 rel.r_extern = 0 ;
10611059 rel.r_type = ARM64_RELOC_UNSIGNED ;
10621060 machobj.fobjbuf.write(&rel, rel.sizeof);
10631061 foffset += rel.sizeof;
10641062 nreloc++ ;
1063+
1064+ int32_t * p = patchAddr64(seg, r.offset);
1065+ // Absolute address; add in addr of start of targ seg
1066+ * p += SecHdrTab64[SegData[s.Sseg].SDshtidx].addr + s.Soffset;
10651067 continue ;
10661068 }
10671069 }
@@ -1144,10 +1146,9 @@ void MachObj_term(const(char)[] objfilename)
11441146 rel.r_address = cast (int )r.offset;
11451147 rel.r_symbolnum = r.targseg;
11461148 rel.r_pcrel = (r.rtype == RELaddr) ? 0 : 1 ;
1147- rel.r_length = 2 ;
1149+ rel.r_length = 3 ;
11481150 rel.r_extern = 0 ;
11491151 rel.r_type = ARM64_RELOC_UNSIGNED ;
1150- rel.r_length = 3 ;
11511152
11521153 machobj.fobjbuf.write(&rel, rel.sizeof);
11531154 foffset += rel.sizeof;
0 commit comments