authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-01-12 23:28:33+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-01-13 20:02:11+01:00
loga8564df9ed510f572732b8179844299fc3d3c11b
treeb5f5db15e5cf233d9afce94f0a9afbad08f2c88e
parent16c55b15cb227067bf8146226139608edddd8e8c

zld: parse addend from BRANCH reloc on x86_64

As usual, MachO, full of surprises!

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

src/link/MachO/Atom.zig+2-1
......@@ -419,6 +419,7 @@ pub fn parseRelocs(self: *Atom, relocs: []macho.relocation_info, context: RelocC
419419 .X86_64_RELOC_BRANCH => {
420420 // TODO rewrite relocation
421421 try addStub(target, context);
422 addend = mem.readIntLittle(i32, self.code.items[offset..][0..4]);
422423 },
423424 .X86_64_RELOC_GOT, .X86_64_RELOC_GOT_LOAD => {
424425 // TODO rewrite relocation
......@@ -1003,7 +1004,7 @@ pub fn resolveRelocs(self: *Atom, macho_file: *MachO) !void {
10031004 .X86_64_RELOC_BRANCH => {
10041005 const displacement = try math.cast(
10051006 i32,
1006 @intCast(i64, target_addr) - @intCast(i64, source_addr) - 4,
1007 @intCast(i64, target_addr) - @intCast(i64, source_addr) - 4 + rel.addend,
10071008 );
10081009 mem.writeIntLittle(u32, self.code.items[rel.offset..][0..4], @bitCast(u32, displacement));
10091010 },