authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-12-08 17:07:58+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-12-08 20:48:12+01:00
log98e36ea6b9aff3403685af3a76ffa998249c9b84
treef9c7f968eea4be85d8114af3e2df4323bda075ba
parentf0ec70edd1ab632ab25d48f7b27a444d9ac444bd

macho: handle non-extern UNSIGNED relocs on arm64


1 files changed, 5 insertions(+), 1 deletions(-)

src/link/MachO/Atom.zig+5-1
...@@ -393,11 +393,15 @@ pub fn parseRelocs(self: *Atom, relocs: []macho.relocation_info, context: RelocC...@@ -393,11 +393,15 @@ pub fn parseRelocs(self: *Atom, relocs: []macho.relocation_info, context: RelocC
393 try addGotEntry(target, context);393 try addGotEntry(target, context);
394 },394 },
395 .ARM64_RELOC_UNSIGNED => {395 .ARM64_RELOC_UNSIGNED => {
396 assert(rel.r_extern == 1);
397 addend = if (rel.r_length == 3)396 addend = if (rel.r_length == 3)
398 mem.readIntLittle(i64, self.code.items[offset..][0..8])397 mem.readIntLittle(i64, self.code.items[offset..][0..8])
399 else398 else
400 mem.readIntLittle(i32, self.code.items[offset..][0..4]);399 mem.readIntLittle(i32, self.code.items[offset..][0..4]);
400 if (rel.r_extern == 0) {
401 const seg = context.object.load_commands.items[context.object.segment_cmd_index.?].Segment;
402 const target_sect_base_addr = seg.sections.items[rel.r_symbolnum - 1].addr;
403 addend -= @intCast(i64, target_sect_base_addr);
404 }
401 try self.addPtrBindingOrRebase(rel, target, context);405 try self.addPtrBindingOrRebase(rel, target, context);
402 },406 },
403 else => {},407 else => {},