authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-11-28 20:47:58-08:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2021-11-28 20:47:58-08:00
loga4aff36fb3d397459de16426ce51cdbd3c5cb0cc
tree01a34c7a52965fbfe5234cc56d61caecaea9f6b3
parent0f63f3eeb742c13ecf8f218f13ce1d3fd06c1be8
parent58a552aaf99f518d3f347c074d20a25c5223404b
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #10239 from ziglang/fix-10207

macho: fix regression in handling SIGNED_X relocs on x86_64

2 files changed, 5 insertions(+), 11 deletions(-)

src/link/MachO.zig+2-10
...@@ -4996,17 +4996,9 @@ fn writeSymbolTable(self: *MachO) !void {...@@ -4996,17 +4996,9 @@ fn writeSymbolTable(self: *MachO) !void {
4996 }4996 }
4997 }4997 }
49984998
4999 var undefs = std.ArrayList(macho.nlist_64).init(self.base.allocator);
5000 defer undefs.deinit();
5001
5002 for (self.undefs.items) |sym| {
5003 if (sym.n_strx == 0) continue;
5004 try undefs.append(sym);
5005 }
5006
5007 const nlocals = locals.items.len;4999 const nlocals = locals.items.len;
5008 const nexports = self.globals.items.len;5000 const nexports = self.globals.items.len;
5009 const nundefs = undefs.items.len;5001 const nundefs = self.undefs.items.len;
50105002
5011 const locals_off = symtab.symoff;5003 const locals_off = symtab.symoff;
5012 const locals_size = nlocals * @sizeOf(macho.nlist_64);5004 const locals_size = nlocals * @sizeOf(macho.nlist_64);
...@@ -5021,7 +5013,7 @@ fn writeSymbolTable(self: *MachO) !void {...@@ -5021,7 +5013,7 @@ fn writeSymbolTable(self: *MachO) !void {
5021 const undefs_off = exports_off + exports_size;5013 const undefs_off = exports_off + exports_size;
5022 const undefs_size = nundefs * @sizeOf(macho.nlist_64);5014 const undefs_size = nundefs * @sizeOf(macho.nlist_64);
5023 log.debug("writing undefined symbols from 0x{x} to 0x{x}", .{ undefs_off, undefs_size + undefs_off });5015 log.debug("writing undefined symbols from 0x{x} to 0x{x}", .{ undefs_off, undefs_size + undefs_off });
5024 try self.base.file.?.pwriteAll(mem.sliceAsBytes(undefs.items), undefs_off);5016 try self.base.file.?.pwriteAll(mem.sliceAsBytes(self.undefs.items), undefs_off);
50255017
5026 symtab.nsyms = @intCast(u32, nlocals + nexports + nundefs);5018 symtab.nsyms = @intCast(u32, nlocals + nexports + nundefs);
5027 seg.inner.filesize += locals_size + exports_size + undefs_size;5019 seg.inner.filesize += locals_size + exports_size + undefs_size;
src/link/MachO/Atom.zig+3-1
...@@ -437,9 +437,11 @@ pub fn parseRelocs(self: *Atom, relocs: []macho.relocation_info, context: RelocC...@@ -437,9 +437,11 @@ pub fn parseRelocs(self: *Atom, relocs: []macho.relocation_info, context: RelocC
437 };437 };
438 addend = mem.readIntLittle(i32, self.code.items[offset..][0..4]) + correction;438 addend = mem.readIntLittle(i32, self.code.items[offset..][0..4]) + correction;
439 if (rel.r_extern == 0) {439 if (rel.r_extern == 0) {
440 // Note for the future self: when r_extern == 0, we should subtract correction from the
441 // addend.
440 const seg = context.object.load_commands.items[context.object.segment_cmd_index.?].Segment;442 const seg = context.object.load_commands.items[context.object.segment_cmd_index.?].Segment;
441 const target_sect_base_addr = seg.sections.items[rel.r_symbolnum - 1].addr;443 const target_sect_base_addr = seg.sections.items[rel.r_symbolnum - 1].addr;
442 addend += @intCast(i64, context.base_addr + offset + correction + 4) -444 addend += @intCast(i64, context.base_addr + offset + 4) -
443 @intCast(i64, target_sect_base_addr);445 @intCast(i64, target_sect_base_addr);
444 }446 }
445 },447 },