@@ -900,6 +900,7 @@ void MachObj_term(const(char)[] objfilename)
900900 r.rtype == REL .add ? " add" :
901901 r.rtype == REL .rel26 ? " rel26" :
902902 " rel" ;
903+ // if (s) printf("seg: %d targsym %s funcsym %s\n", seg, s ? s.Sident.ptr : "null", r.funcsym ? r.funcsym.Sident.ptr : "null");
903904 relocation_info rel;
904905 scattered_relocation_info srel;
905906 if (machobj.AArch64)
@@ -912,6 +913,10 @@ void MachObj_term(const(char)[] objfilename)
912913 { symbol_print(* s);
913914 printf(" %d:x%04llx isCode %x : targseg %d targsym %s REL%s flag %d\n " , seg, r.offset, pseg.isCode(), r.targseg, s ? s.Sident.ptr : " 0" , rs, r.flag);
914915 }
916+ if (0 )// s.Sclass == SC.locstat)
917+ { symbol_print(* s);
918+ printf(" %d:x%04llx isCode %x : targseg %d targsym %s REL%s flag %d\n " , seg, r.offset, pseg.isCode(), r.targseg, s ? s.Sident.ptr : " 0" , rs, r.flag);
919+ }
915920 if (r.flag == 1 ) // emit SUBTRACTOR/UNSIGNED pair
916921 {
917922 // printf("rel1\n");
@@ -920,7 +925,7 @@ void MachObj_term(const(char)[] objfilename)
920925 rel.r_symbolnum = r.funcsym.Sxtrnnum;
921926 rel.r_pcrel = 0 ;
922927 rel.r_length = 3 ;
923- rel.r_extern = 1 ;
928+ rel.r_extern = r.funcsym.Sclass == SC .locstat ? 0 : 1 ;
924929 machobj.fobjbuf.write(&rel, rel.sizeof);
925930 foffset += (rel).sizeof;
926931 ++ nreloc;
@@ -1003,7 +1008,7 @@ void MachObj_term(const(char)[] objfilename)
10031008 rel.r_address = cast (int )r.offset;
10041009 rel.r_symbolnum = s.Sxtrnnum;
10051010 rel.r_length = 2 ;
1006- rel.r_extern = 1 ;
1011+ rel.r_extern = 1 ; // 0?
10071012 machobj.fobjbuf.write(&rel, rel.sizeof);
10081013 foffset += rel.sizeof;
10091014 nreloc++ ;
@@ -1040,8 +1045,16 @@ void MachObj_term(const(char)[] objfilename)
10401045 {
10411046 rel.r_address = cast (int )r.offset;
10421047 rel.r_symbolnum = s.Sxtrnnum;
1043- rel.r_pcrel = 0 ;
1044- rel.r_length = 3 ;
1048+ if (r.rtype == REL .rel)
1049+ {
1050+ rel.r_pcrel = 1 ;
1051+ rel.r_length = 2 ;
1052+ }
1053+ else
1054+ {
1055+ rel.r_pcrel = 0 ;
1056+ rel.r_length = 3 ;
1057+ }
10451058 rel.r_extern = 1 ;
10461059 rel.r_type = ARM64_RELOC_UNSIGNED ; // RELOC_POINTER_TO_GOT?
10471060 machobj.fobjbuf.write(&rel, rel.sizeof);
@@ -2508,6 +2521,7 @@ void MachObj_pubdef(int seg, Symbol* s, targ_size_t offset)
25082521 }
25092522 goto default ;
25102523 default :
2524+ // printf("Writing to local symbuf: %s\n", s.Sident.ptr);
25112525 machobj.local_symbuf.write((&s)[0 .. 1 ]);
25122526 break ;
25132527 }
@@ -2707,7 +2721,7 @@ size_t MachObj_bytes(int seg, targ_size_t offset, size_t nbytes, const(void)* p)
27072721void MachObj_addrel (int seg, targ_size_t offset, Symbol* targsym,
27082722 uint targseg, REL rtype, int val = 0 )
27092723{
2710- // printf("MachObj_addrel()\n");
2724+ // printf("MachObj_addrel() %s \n", targsym.Sident.ptr );
27112725 Relocation rel = void ;
27122726 rel.offset = offset;
27132727 rel.targsym = targsym;
@@ -2993,10 +3007,10 @@ int MachObj_reftoidentAArch64(int seg, targ_size_t offset, Symbol* s, targ_size_
29933007 {
29943008 debug printf(" \n MachObj_reftoidentAArch64('%s' seg %d, offset x%llx, val x%llx, flags x%x) " ,
29953009 s.Sident.ptr,seg,cast (ulong )offset,cast (ulong )val,flags);
2996- CF_print(flags);
2997- debug printf(" retsize = %d\n " , retsize);
3010+ // CF_print(flags);
3011+ // debug printf("retsize = %d\n", retsize);
29983012 // dbg_printf("Sseg = %d, Sxtrnnum = %d\n",s.Sseg,s.Sxtrnnum);
2999- symbol_print(* s);
3013+ // symbol_print(*s);
30003014 }
30013015 assert (seg > 0 );
30023016 if (s.Sclass != SC .locstat && ! s.Sxtrnnum)
@@ -3177,10 +3191,14 @@ void MachObj_write_pointerRef(Symbol* s, uint off)
31773191 * Returns:
31783192 * number of bytes written at seg:offset
31793193 */
3194+ @trusted
31803195int mach_dwarf_reftoident (int seg, targ_size_t offset, Symbol* s, targ_size_t val)
31813196{
31823197 // printf("dwarf_reftoident(seg=%d offset=x%x s=%s val=x%x\n", seg, cast(int)offset, s.Sident.ptr, cast(int)val);
3183- MachObj_reftoident(seg, offset, s, val + 4 , I64 ? CFoff : CFindirect);
3198+ if (machobj.AArch64)
3199+ MachObj_reftoident(seg, offset, s, val + 4 , CFselfrel);
3200+ else
3201+ MachObj_reftoident(seg, offset, s, val + 4 , I64 ? CFoff : CFindirect);
31843202 return 4 ;
31853203}
31863204
@@ -3216,7 +3234,7 @@ int mach_dwarf_reftoident(int seg, targ_size_t offset, Symbol* s, targ_size_t va
32163234@trusted
32173235int dwarf_eh_frame_fixup (int dfseg, targ_size_t offset, Symbol* s, targ_size_t val, Symbol* fdesym)
32183236{
3219- // printf("dwarf_eh_frame_fixup()\n");
3237+ // printf("dwarf_eh_frame_fixup() %s \n", fdesym.Sident.ptr );
32203238 OutBuffer * buf = SegData[dfseg].SDbuf;
32213239 assert (offset == buf.length());
32223240 assert (fdesym.Sseg == dfseg);
0 commit comments