| ... | @@ -337,14 +337,6 @@ pub const Relocation = struct { | ... | @@ -337,14 +337,6 @@ pub const Relocation = struct { |
| 337 | correction: i4, | 337 | correction: i4, |
| 338 | | 338 | |
| 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 | } |
| 886 | | 885 | |
| 887 | parsed.payload = .{ | 886 | parsed.payload = .{ |
| 888 | .signed = .{ | 887 | .signed = .{ |