| ... | ... | @@ -119,9 +119,19 @@ pub fn getThunk(self: Atom, macho_file: *MachO) *Thunk { |
| 119 | 119 | |
| 120 | 120 | pub fn initOutputSection(sect: macho.section_64, macho_file: *MachO) !u8 { |
| 121 | 121 | const segname, const sectname, const flags = blk: { |
| 122 | // Sanitize names produced by Zig self-hosted backends. |
| 123 | // TODO perhaps we simply should emit different names instead? |
| 124 | const segname = if (mem.indexOf(u8, sect.segName(), "_ZIG")) |idx| |
| 125 | sect.segName()[0..idx] |
| 126 | else |
| 127 | sect.segName(); |
| 128 | const sectname = if (mem.indexOf(u8, sect.sectName(), "_zig")) |idx| |
| 129 | sect.sectName()[0..idx] |
| 130 | else |
| 131 | sect.sectName(); |
| 122 | 132 | if (sect.isCode()) break :blk .{ |
| 123 | 133 | "__TEXT", |
| 124 | | sect.sectName(), |
| 134 | sectname, |
| 125 | 135 | macho.S_REGULAR | macho.S_ATTR_PURE_INSTRUCTIONS | macho.S_ATTR_SOME_INSTRUCTIONS, |
| 126 | 136 | }; |
| 127 | 137 | |
| ... | ... | @@ -132,15 +142,15 @@ pub fn initOutputSection(sect: macho.section_64, macho_file: *MachO) !u8 { |
| 132 | 142 | => break :blk .{ "__TEXT", "__const", macho.S_REGULAR }, |
| 133 | 143 | |
| 134 | 144 | macho.S_CSTRING_LITERALS => { |
| 135 | | if (mem.startsWith(u8, sect.sectName(), "__objc")) break :blk .{ |
| 136 | | sect.segName(), sect.sectName(), macho.S_REGULAR, |
| 145 | if (mem.startsWith(u8, sectname, "__objc")) break :blk .{ |
| 146 | segname, sectname, macho.S_REGULAR, |
| 137 | 147 | }; |
| 138 | 148 | break :blk .{ "__TEXT", "__cstring", macho.S_CSTRING_LITERALS }; |
| 139 | 149 | }, |
| 140 | 150 | |
| 141 | 151 | macho.S_MOD_INIT_FUNC_POINTERS, |
| 142 | 152 | macho.S_MOD_TERM_FUNC_POINTERS, |
| 143 | | => break :blk .{ "__DATA_CONST", sect.sectName(), sect.flags }, |
| 153 | => break :blk .{ "__DATA_CONST", sectname, sect.flags }, |
| 144 | 154 | |
| 145 | 155 | macho.S_LITERAL_POINTERS, |
| 146 | 156 | macho.S_ZEROFILL, |
| ... | ... | @@ -149,17 +159,15 @@ pub fn initOutputSection(sect: macho.section_64, macho_file: *MachO) !u8 { |
| 149 | 159 | macho.S_THREAD_LOCAL_VARIABLE_POINTERS, |
| 150 | 160 | macho.S_THREAD_LOCAL_REGULAR, |
| 151 | 161 | macho.S_THREAD_LOCAL_ZEROFILL, |
| 152 | | => break :blk .{ sect.segName(), sect.sectName(), sect.flags }, |
| 162 | => break :blk .{ segname, sectname, sect.flags }, |
| 153 | 163 | |
| 154 | 164 | macho.S_COALESCED => break :blk .{ |
| 155 | | sect.segName(), |
| 156 | | sect.sectName(), |
| 165 | segname, |
| 166 | sectname, |
| 157 | 167 | macho.S_REGULAR, |
| 158 | 168 | }, |
| 159 | 169 | |
| 160 | 170 | macho.S_REGULAR => { |
| 161 | | const segname = sect.segName(); |
| 162 | | const sectname = sect.sectName(); |
| 163 | 171 | if (mem.eql(u8, segname, "__DATA")) { |
| 164 | 172 | if (mem.eql(u8, sectname, "__const") or |
| 165 | 173 | mem.eql(u8, sectname, "__cfstring") or |
| ... | ... | @@ -173,7 +181,7 @@ pub fn initOutputSection(sect: macho.section_64, macho_file: *MachO) !u8 { |
| 173 | 181 | break :blk .{ segname, sectname, sect.flags }; |
| 174 | 182 | }, |
| 175 | 183 | |
| 176 | | else => break :blk .{ sect.segName(), sect.sectName(), sect.flags }, |
| 184 | else => break :blk .{ segname, sectname, sect.flags }, |
| 177 | 185 | } |
| 178 | 186 | }; |
| 179 | 187 | const osec = macho_file.getSectionByName(segname, sectname) orelse try macho_file.addSection( |