From dc6db3b30911a09890d6b5674c72a9db5a52e050 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Fri, 2 Feb 2024 23:42:38 +0100 Subject: [PATCH] macho: minor fixes and sanitize input *_zig segment/sections names --- src/link/MachO/Atom.zig | 28 ++++++++++++++++++---------- src/link/MachO/ZigObject.zig | 2 ++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/link/MachO/Atom.zig b/src/link/MachO/Atom.zig index 59a60f6858..7e18c002a2 100644 --- a/src/link/MachO/Atom.zig +++ b/src/link/MachO/Atom.zig @@ -119,9 +119,19 @@ pub fn getThunk(self: Atom, macho_file: *MachO) *Thunk { pub fn initOutputSection(sect: macho.section_64, macho_file: *MachO) !u8 { const segname, const sectname, const flags = blk: { + // Sanitize names produced by Zig self-hosted backends. + // TODO perhaps we simply should emit different names instead? + const segname = if (mem.indexOf(u8, sect.segName(), "_ZIG")) |idx| + sect.segName()[0..idx] + else + sect.segName(); + const sectname = if (mem.indexOf(u8, sect.sectName(), "_zig")) |idx| + sect.sectName()[0..idx] + else + sect.sectName(); if (sect.isCode()) break :blk .{ "__TEXT", - sect.sectName(), + sectname, macho.S_REGULAR | macho.S_ATTR_PURE_INSTRUCTIONS | macho.S_ATTR_SOME_INSTRUCTIONS, }; @@ -132,15 +142,15 @@ pub fn initOutputSection(sect: macho.section_64, macho_file: *MachO) !u8 { => break :blk .{ "__TEXT", "__const", macho.S_REGULAR }, macho.S_CSTRING_LITERALS => { - if (mem.startsWith(u8, sect.sectName(), "__objc")) break :blk .{ - sect.segName(), sect.sectName(), macho.S_REGULAR, + if (mem.startsWith(u8, sectname, "__objc")) break :blk .{ + segname, sectname, macho.S_REGULAR, }; break :blk .{ "__TEXT", "__cstring", macho.S_CSTRING_LITERALS }; }, macho.S_MOD_INIT_FUNC_POINTERS, macho.S_MOD_TERM_FUNC_POINTERS, - => break :blk .{ "__DATA_CONST", sect.sectName(), sect.flags }, + => break :blk .{ "__DATA_CONST", sectname, sect.flags }, macho.S_LITERAL_POINTERS, macho.S_ZEROFILL, @@ -149,17 +159,15 @@ pub fn initOutputSection(sect: macho.section_64, macho_file: *MachO) !u8 { macho.S_THREAD_LOCAL_VARIABLE_POINTERS, macho.S_THREAD_LOCAL_REGULAR, macho.S_THREAD_LOCAL_ZEROFILL, - => break :blk .{ sect.segName(), sect.sectName(), sect.flags }, + => break :blk .{ segname, sectname, sect.flags }, macho.S_COALESCED => break :blk .{ - sect.segName(), - sect.sectName(), + segname, + sectname, macho.S_REGULAR, }, macho.S_REGULAR => { - const segname = sect.segName(); - const sectname = sect.sectName(); if (mem.eql(u8, segname, "__DATA")) { if (mem.eql(u8, sectname, "__const") or mem.eql(u8, sectname, "__cfstring") or @@ -173,7 +181,7 @@ pub fn initOutputSection(sect: macho.section_64, macho_file: *MachO) !u8 { break :blk .{ segname, sectname, sect.flags }; }, - else => break :blk .{ sect.segName(), sect.sectName(), sect.flags }, + else => break :blk .{ segname, sectname, sect.flags }, } }; const osec = macho_file.getSectionByName(segname, sectname) orelse try macho_file.addSection( diff --git a/src/link/MachO/ZigObject.zig b/src/link/MachO/ZigObject.zig index 8cb7a466fa..df2cac41db 100644 --- a/src/link/MachO/ZigObject.zig +++ b/src/link/MachO/ZigObject.zig @@ -196,8 +196,10 @@ pub fn resolveSymbols(self: *ZigObject, macho_file: *MachO) void { const atom = macho_file.getAtom(atom_index).?; break :blk nlist.n_value - atom.getInputAddress(macho_file); } else nlist.n_value; + const out_n_sect = if (nlist.sect()) macho_file.getAtom(atom_index).?.out_n_sect else 0; symbol.value = value; symbol.atom = atom_index; + symbol.out_n_sect = out_n_sect; symbol.nlist_idx = nlist_idx; symbol.file = self.index; symbol.flags.weak = nlist.weakDef();