authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-07-11 21:54:19+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-07-15 18:49:47+02:00
loge3fe9a9df55e36f8ee402b8edb26267b5145ce08
tree4f8e69e2133892816546c2e1e128e3f07b6c969b
parentb8fce705ad793aab62507d90c44a3fb7a548b90b

zld: fix parsing and resolving Signed relocs

on x86_64-macos since this an x86_64 only relocation type.

1 files changed, 8 insertions(+), 9 deletions(-)

src/link/MachO/reloc.zig+8-9
...@@ -337,14 +337,6 @@ pub const Relocation = struct {...@@ -337,14 +337,6 @@ pub const Relocation = struct {
337 correction: i4,337 correction: i4,
338338
339 pub fn resolve(self: Signed, base: Relocation, source_addr: u64, target_addr: u64) !void {339 pub fn resolve(self: Signed, base: Relocation, source_addr: u64, target_addr: u64) !void {
340 // const target_addr = target_addr: {
341 // if (signed.base.target == .section) {
342 // const source_target = @intCast(i64, args.source_source_sect_addr.?) + @intCast(i64, signed.base.offset) + signed.addend + 4;
343 // const source_disp = source_target - @intCast(i64, args.source_target_sect_addr.?);
344 // break :target_addr @intCast(i64, args.target_addr) + source_disp;
345 // }
346 // break :target_addr @intCast(i64, args.target_addr) + signed.addend;
347 // };
348 const actual_target_addr = @intCast(i64, target_addr) + self.addend;340 const actual_target_addr = @intCast(i64, target_addr) + self.addend;
349 const displacement = try math.cast(341 const displacement = try math.cast(
350 i32,342 i32,
...@@ -882,7 +874,14 @@ pub const Parser = struct {...@@ -882,7 +874,14 @@ pub const Parser = struct {
882 .X86_64_RELOC_SIGNED_4 => 4,874 .X86_64_RELOC_SIGNED_4 => 4,
883 else => unreachable,875 else => unreachable,
884 };876 };
885 const addend = mem.readIntLittle(i32, self.block.code[parsed.offset..][0..4]) + correction;877 var addend = mem.readIntLittle(i32, self.block.code[parsed.offset..][0..4]) + correction;
878
879 if (rel.r_extern == 0) {
880 const source_sym = self.zld.locals.items[self.block.local_sym_index].payload.regular;
881 const source_addr = source_sym.address + parsed.offset + @intCast(u32, addend) + 4;
882 const target_sym = parsed.target.payload.regular;
883 addend = try math.cast(i32, @intCast(i64, source_addr) - @intCast(i64, target_sym.address));
884 }
886885
887 parsed.payload = .{886 parsed.payload = .{
888 .signed = .{887 .signed = .{