mirror of
https://github.com/ziglang/zig.git
synced 2025-01-21 01:14:32 +00:00
Merge pull request #10239 from ziglang/fix-10207
macho: fix regression in handling SIGNED_X relocs on x86_64
This commit is contained in:
commit
a4aff36fb3
@ -4996,17 +4996,9 @@ fn writeSymbolTable(self: *MachO) !void {
|
||||
}
|
||||
}
|
||||
|
||||
var undefs = std.ArrayList(macho.nlist_64).init(self.base.allocator);
|
||||
defer undefs.deinit();
|
||||
|
||||
for (self.undefs.items) |sym| {
|
||||
if (sym.n_strx == 0) continue;
|
||||
try undefs.append(sym);
|
||||
}
|
||||
|
||||
const nlocals = locals.items.len;
|
||||
const nexports = self.globals.items.len;
|
||||
const nundefs = undefs.items.len;
|
||||
const nundefs = self.undefs.items.len;
|
||||
|
||||
const locals_off = symtab.symoff;
|
||||
const locals_size = nlocals * @sizeOf(macho.nlist_64);
|
||||
@ -5021,7 +5013,7 @@ fn writeSymbolTable(self: *MachO) !void {
|
||||
const undefs_off = exports_off + exports_size;
|
||||
const undefs_size = nundefs * @sizeOf(macho.nlist_64);
|
||||
log.debug("writing undefined symbols from 0x{x} to 0x{x}", .{ undefs_off, undefs_size + undefs_off });
|
||||
try self.base.file.?.pwriteAll(mem.sliceAsBytes(undefs.items), undefs_off);
|
||||
try self.base.file.?.pwriteAll(mem.sliceAsBytes(self.undefs.items), undefs_off);
|
||||
|
||||
symtab.nsyms = @intCast(u32, nlocals + nexports + nundefs);
|
||||
seg.inner.filesize += locals_size + exports_size + undefs_size;
|
||||
|
@ -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);
|
||||
}
|
||||
},
|
||||
|
Loading…
Reference in New Issue
Block a user