commit 98e36ea6b9aff3403685af3a76ffa998249c9b84 (tree)
parent f0ec70edd1ab632ab25d48f7b27a444d9ac444bd
Author: Jakub Konka <kubkon@jakubkonka.com>
Date: Wed, 8 Dec 2021 17:07:58 +0100
macho: handle non-extern UNSIGNED relocs on arm64
Diffstat:
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/link/MachO/Atom.zig b/src/link/MachO/Atom.zig
@@ -393,11 +393,15 @@ pub fn parseRelocs(self: *Atom, relocs: []macho.relocation_info, context: RelocC
try addGotEntry(target, context);
},
.ARM64_RELOC_UNSIGNED => {
- assert(rel.r_extern == 1);
addend = if (rel.r_length == 3)
mem.readIntLittle(i64, self.code.items[offset..][0..8])
else
mem.readIntLittle(i32, self.code.items[offset..][0..4]);
+ if (rel.r_extern == 0) {
+ const seg = context.object.load_commands.items[context.object.segment_cmd_index.?].Segment;
+ const target_sect_base_addr = seg.sections.items[rel.r_symbolnum - 1].addr;
+ addend -= @intCast(i64, target_sect_base_addr);
+ }
try self.addPtrBindingOrRebase(rel, target, context);
},
else => {},