authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2020-11-13 12:39:35+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2020-11-26 11:50:09+01:00
log7dd5ce25270ddd3a3ba3570e89654e305dbc2e76
treea7e842b34be016914b6a88715a22de960f4dcbea
parent1bec531cf234f04818e22b7b792b18a88c5faf88

stage2 macOS: make exe flagged as pie


1 files changed, 17 insertions(+), 5 deletions(-)

src/link/MachO.zig+17-5
......@@ -388,6 +388,10 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void {
388388 const symtab = &self.load_commands.items[self.symtab_cmd_index.?].Symtab;
389389 symtab.nsyms = nlocals + nglobals + nundefs;
390390 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;
391395 }
392396
393397 try self.writeStringTable();
......@@ -1243,7 +1247,8 @@ pub fn populateMissingMetadata(self: *MachO) !void {
12431247 if (self.linkedit_segment_cmd_index == null) {
12441248 self.linkedit_segment_cmd_index = @intCast(u16, self.load_commands.items.len);
12451249 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;
12471252 try self.load_commands.append(self.base.allocator, .{
12481253 .Segment = .{
12491254 .cmd = macho.LC_SEGMENT_64,
......@@ -1253,8 +1258,8 @@ pub fn populateMissingMetadata(self: *MachO) !void {
12531258 .vmsize = 0,
12541259 .fileoff = 0,
12551260 .filesize = 0,
1256 .maxprot = prot,
1257 .initprot = prot,
1261 .maxprot = maxprot,
1262 .initprot = initprot,
12581263 .nsects = 0,
12591264 .flags = 0,
12601265 },
......@@ -1840,8 +1845,15 @@ fn writeMachOHeader(self: *MachO) !void {
18401845
18411846 hdr.sizeofcmds = sizeofcmds;
18421847
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;
18451857 hdr.reserved = 0;
18461858
18471859 log.debug("writing Mach-O header {}\n", .{hdr});