diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2020-11-17 14:59:31 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2020-11-26 11:50:09 +0100 |
| commit | bbc4ee3f175d8b6c3bf8f6bdf03a7ce05b2935ea (patch) | |
| tree | dd3336d995518f100dbe514bfd8dd4c0ac8deee4 /src/link | |
| parent | a2e0e33249c786e766e185223875b3cef6c946fb (diff) | |
| download | zig-bbc4ee3f175d8b6c3bf8f6bdf03a7ce05b2935ea.tar.gz zig-bbc4ee3f175d8b6c3bf8f6bdf03a7ce05b2935ea.zip | |
stage2 macho: refactor
Diffstat (limited to 'src/link')
| -rw-r--r-- | src/link/MachO.zig | 97 |
1 files changed, 49 insertions, 48 deletions
diff --git a/src/link/MachO.zig b/src/link/MachO.zig index f78e6d2d17..474795ea57 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -1,4 +1,5 @@ const MachO = @This(); + const std = @import("std"); const Allocator = std.mem.Allocator; const assert = std.debug.assert; @@ -1172,7 +1173,6 @@ pub fn populateMissingMetadata(self: *MachO) !void { text_segment.nsects += 1; const program_code_size_hint = self.base.options.program_code_size_hint; - // const program_code_size_hint = 128; const file_size = mem.alignForwardGeneric(u64, program_code_size_hint, self.page_size); const off = @intCast(u32, self.findFreeSpace(file_size, self.page_size)); // TODO maybe findFreeSpace should return u32 directly? const flags = macho.S_REGULAR | macho.S_ATTR_PURE_INSTRUCTIONS | macho.S_ATTR_SOME_INSTRUCTIONS; @@ -1294,22 +1294,6 @@ pub fn populateMissingMetadata(self: *MachO) !void { }); self.cmd_table_dirty = true; } - { - const linkedit = &self.load_commands.items[self.linkedit_segment_cmd_index.?].Segment; - const dyld_info = &self.load_commands.items[self.dyld_info_cmd_index.?].DyldInfo; - if (dyld_info.export_off == 0) { - const nsyms = self.base.options.symbol_count_hint; - const file_size = @sizeOf(u64) * nsyms; - const off = @intCast(u32, self.findFreeSpace(file_size, self.page_size)); - log.debug("found export trie free space 0x{x} to 0x{x}\n", .{ off, off + file_size }); - dyld_info.export_off = off; - dyld_info.export_size = @intCast(u32, file_size); - - const segment_size = mem.alignForwardGeneric(u64, file_size, self.page_size); - linkedit.vmsize += segment_size; - linkedit.fileoff = off; - } - } if (self.symtab_cmd_index == null) { self.symtab_cmd_index = @intCast(u16, self.load_commands.items.len); try self.load_commands.append(self.base.allocator, .{ @@ -1352,35 +1336,6 @@ pub fn populateMissingMetadata(self: *MachO) !void { }); self.cmd_table_dirty = true; } - { - const linkedit = &self.load_commands.items[self.linkedit_segment_cmd_index.?].Segment; - const symtab = &self.load_commands.items[self.symtab_cmd_index.?].Symtab; - if (symtab.symoff == 0) { - const nsyms = self.base.options.symbol_count_hint; - const file_size = @sizeOf(macho.nlist_64) * nsyms; - const off = @intCast(u32, self.findFreeSpace(file_size, self.page_size)); - log.debug("found symbol table free space 0x{x} to 0x{x}\n", .{ off, off + file_size }); - symtab.symoff = off; - symtab.nsyms = @intCast(u32, nsyms); - - const segment_size = mem.alignForwardGeneric(u64, file_size, self.page_size); - linkedit.vmsize += segment_size; - // TODO this is needed to please codesign_allocate - const dyld_info = &self.load_commands.items[self.dyld_info_cmd_index.?].DyldInfo; - dyld_info.export_size = off - dyld_info.export_off; - } - if (symtab.stroff == 0) { - try self.string_table.append(self.base.allocator, 0); - const file_size = @intCast(u32, self.string_table.items.len); - const off = @intCast(u32, self.findFreeSpace(file_size, self.page_size)); - log.debug("found string table free space 0x{x} to 0x{x}\n", .{ off, off + file_size }); - symtab.stroff = off; - symtab.strsize = file_size; - - const segment_size = mem.alignForwardGeneric(u64, file_size, self.page_size); - linkedit.vmsize += segment_size; - } - } if (self.dylinker_cmd_index == null) { self.dylinker_cmd_index = @intCast(u16, self.load_commands.items.len); const cmdsize = mem.alignForwardGeneric(u64, @sizeOf(macho.dylinker_command) + mem.lenZ(DEFAULT_DYLD_PATH), @sizeOf(u64)); @@ -1458,6 +1413,51 @@ pub fn populateMissingMetadata(self: *MachO) !void { }, }); } + { + const linkedit = &self.load_commands.items[self.linkedit_segment_cmd_index.?].Segment; + const dyld_info = &self.load_commands.items[self.dyld_info_cmd_index.?].DyldInfo; + if (dyld_info.export_off == 0) { + const nsyms = self.base.options.symbol_count_hint; + const file_size = @sizeOf(u64) * nsyms; + const off = @intCast(u32, self.findFreeSpace(file_size, self.page_size)); + log.debug("found export trie free space 0x{x} to 0x{x}\n", .{ off, off + file_size }); + dyld_info.export_off = off; + dyld_info.export_size = @intCast(u32, file_size); + + const segment_size = mem.alignForwardGeneric(u64, file_size, self.page_size); + linkedit.vmsize += segment_size; + linkedit.fileoff = off; + } + } + { + const linkedit = &self.load_commands.items[self.linkedit_segment_cmd_index.?].Segment; + const symtab = &self.load_commands.items[self.symtab_cmd_index.?].Symtab; + if (symtab.symoff == 0) { + const nsyms = self.base.options.symbol_count_hint; + const file_size = @sizeOf(macho.nlist_64) * nsyms; + const off = @intCast(u32, self.findFreeSpace(file_size, self.page_size)); + log.debug("found symbol table free space 0x{x} to 0x{x}\n", .{ off, off + file_size }); + symtab.symoff = off; + symtab.nsyms = @intCast(u32, nsyms); + + const segment_size = mem.alignForwardGeneric(u64, file_size, self.page_size); + linkedit.vmsize += segment_size; + // TODO this is needed to please codesign_allocate + const dyld_info = &self.load_commands.items[self.dyld_info_cmd_index.?].DyldInfo; + dyld_info.export_size = off - dyld_info.export_off; + } + if (symtab.stroff == 0) { + try self.string_table.append(self.base.allocator, 0); + const file_size = @intCast(u32, self.string_table.items.len); + const off = @intCast(u32, self.findFreeSpace(file_size, self.page_size)); + log.debug("found string table free space 0x{x} to 0x{x}\n", .{ off, off + file_size }); + symtab.stroff = off; + symtab.strsize = file_size; + + const segment_size = mem.alignForwardGeneric(u64, file_size, self.page_size); + linkedit.vmsize += segment_size; + } + } if (self.dyld_stub_binder_index == null) { self.dyld_stub_binder_index = @intCast(u16, self.undef_symbols.items.len); const name = try self.makeString("dyld_stub_binder"); @@ -1759,7 +1759,9 @@ fn writeStringTable(self: *MachO) !void { symtab.stroff = @intCast(u32, self.findFreeSpace(needed_size, 1)); } symtab.strsize = @intCast(u32, needed_size); - log.debug("writing string table from 0x{x} to 0x{x}\n", .{ symtab.stroff, symtab.stroff + needed_size }); + + log.debug("writing string table from 0x{x} to 0x{x}\n", .{ symtab.stroff, symtab.stroff + symtab.strsize }); + try self.base.file.?.pwriteAll(self.string_table.items, symtab.stroff); // TODO rework how we preallocate space for the entire __LINKEDIT segment instead of @@ -1871,7 +1873,6 @@ fn writeMachOHeader(self: *MachO) !void { }, } hdr.reserved = 0; - hdr.reserved = 0; log.debug("writing Mach-O header {}\n", .{hdr}); |
