| ... | ... | @@ -337,14 +337,6 @@ pub const Relocation = struct { |
| 337 | 337 | correction: i4, |
| 338 | 338 | |
| 339 | 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 | 340 | const actual_target_addr = @intCast(i64, target_addr) + self.addend; |
| 349 | 341 | const displacement = try math.cast( |
| 350 | 342 | i32, |
| ... | ... | @@ -882,7 +874,14 @@ pub const Parser = struct { |
| 882 | 874 | .X86_64_RELOC_SIGNED_4 => 4, |
| 883 | 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 | 886 | parsed.payload = .{ |
| 888 | 887 | .signed = .{ |