From 7e27ab09476870e4b37a04172043c66b4bd77c20 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Sun, 28 Nov 2021 20:35:00 +0100 Subject: [PATCH] macho: fix parsing addend for non-extern SIGNED_X reloc If `r_extern == 0` (the relocation is non-extern, meaning it targets a specific memory offset within the object's section) and if the relocation type signifies that the relocation requires correction for RIP such as SIGNED_1, then we need to subtract the correction, here 1 for SIGNED_1, from the calculated addend value as it's implicitly included. --- src/link/MachO/Atom.zig | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/link/MachO/Atom.zig b/src/link/MachO/Atom.zig index b189cc7eea..3fbb26d79f 100644 --- a/src/link/MachO/Atom.zig +++ b/src/link/MachO/Atom.zig @@ -437,9 +437,11 @@ pub fn parseRelocs(self: *Atom, relocs: []macho.relocation_info, context: RelocC }; addend = mem.readIntLittle(i32, self.code.items[offset..][0..4]) + correction; if (rel.r_extern == 0) { + // Note for the future self: when r_extern == 0, we should subtract correction from the + // addend. 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, context.base_addr + offset + correction + 4) - + addend += @intCast(i64, context.base_addr + offset + 4) - @intCast(i64, target_sect_base_addr); } },