| ... | ... | @@ -388,6 +388,10 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void { |
| 388 | 388 | const symtab = &self.load_commands.items[self.symtab_cmd_index.?].Symtab; |
| 389 | 389 | symtab.nsyms = nlocals + nglobals + nundefs; |
| 390 | 390 | symtab.stroff = symtab.symoff + symtab.nsyms * @sizeOf(macho.nlist_64); |
| 391 | |
| 392 | // Extend dynamic linker info until start of symbol table |
| 393 | const dyld_info = &self.load_commands.items[self.dyld_info_cmd_index.?].DyldInfo; |
| 394 | dyld_info.export_size = symtab.symoff - dyld_info.export_off; |
| 391 | 395 | } |
| 392 | 396 | |
| 393 | 397 | try self.writeStringTable(); |
| ... | ... | @@ -1243,7 +1247,8 @@ pub fn populateMissingMetadata(self: *MachO) !void { |
| 1243 | 1247 | if (self.linkedit_segment_cmd_index == null) { |
| 1244 | 1248 | self.linkedit_segment_cmd_index = @intCast(u16, self.load_commands.items.len); |
| 1245 | 1249 | const data_segment = &self.load_commands.items[self.data_segment_cmd_index.?].Segment; |
| 1246 | | const prot = macho.VM_PROT_READ | macho.VM_PROT_WRITE | macho.VM_PROT_EXECUTE; |
| 1250 | const maxprot = macho.VM_PROT_READ | macho.VM_PROT_WRITE | macho.VM_PROT_EXECUTE; |
| 1251 | const initprot = macho.VM_PROT_READ; |
| 1247 | 1252 | try self.load_commands.append(self.base.allocator, .{ |
| 1248 | 1253 | .Segment = .{ |
| 1249 | 1254 | .cmd = macho.LC_SEGMENT_64, |
| ... | ... | @@ -1253,8 +1258,8 @@ pub fn populateMissingMetadata(self: *MachO) !void { |
| 1253 | 1258 | .vmsize = 0, |
| 1254 | 1259 | .fileoff = 0, |
| 1255 | 1260 | .filesize = 0, |
| 1256 | | .maxprot = prot, |
| 1257 | | .initprot = prot, |
| 1261 | .maxprot = maxprot, |
| 1262 | .initprot = initprot, |
| 1258 | 1263 | .nsects = 0, |
| 1259 | 1264 | .flags = 0, |
| 1260 | 1265 | }, |
| ... | ... | @@ -1840,8 +1845,15 @@ fn writeMachOHeader(self: *MachO) !void { |
| 1840 | 1845 | |
| 1841 | 1846 | hdr.sizeofcmds = sizeofcmds; |
| 1842 | 1847 | |
| 1843 | | // TODO should these be set to something else? |
| 1844 | | hdr.flags = 0; |
| 1848 | switch (self.base.options.output_mode) { |
| 1849 | .Exe => { |
| 1850 | hdr.flags = macho.MH_NOUNDEFS | macho.MH_DYLDLINK | macho.MH_PIE; |
| 1851 | }, |
| 1852 | else => { |
| 1853 | hdr.flags = 0; |
| 1854 | }, |
| 1855 | } |
| 1856 | hdr.reserved = 0; |
| 1845 | 1857 | hdr.reserved = 0; |
| 1846 | 1858 | |
| 1847 | 1859 | log.debug("writing Mach-O header {}\n", .{hdr}); |