diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-11-28 20:47:58 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-11-28 20:47:58 -0800 |
| commit | a4aff36fb3d397459de16426ce51cdbd3c5cb0cc (patch) | |
| tree | 01a34c7a52965fbfe5234cc56d61caecaea9f6b3 /src | |
| parent | 0f63f3eeb742c13ecf8f218f13ce1d3fd06c1be8 (diff) | |
| parent | 58a552aaf99f518d3f347c074d20a25c5223404b (diff) | |
| download | zig-a4aff36fb3d397459de16426ce51cdbd3c5cb0cc.tar.gz zig-a4aff36fb3d397459de16426ce51cdbd3c5cb0cc.zip | |
Merge pull request #10239 from ziglang/fix-10207
macho: fix regression in handling SIGNED_X relocs on x86_64
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/MachO.zig | 12 | ||||
| -rw-r--r-- | src/link/MachO/Atom.zig | 4 |
2 files changed, 5 insertions, 11 deletions
diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 37f905cdd4..2508b61a38 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -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; diff --git a/src/link/MachO/Atom.zig b/src/link/MachO/Atom.zig index b189cc7eea..3fbb26d79f 100644 --- a/src/link/MachO/Atom.zig +++ b/src/link/MachO/Atom.zig @@ -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); } }, |
