diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2022-12-14 15:31:56 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2022-12-16 00:01:04 +0100 |
| commit | 6b99aab0eb25821d91c1708575cabdadc9079024 (patch) | |
| tree | 67b5ccbae476c438a2d91bbc4df982028efaf020 | |
| parent | 79457fc76a61695560e6314246b0a8c21a7e2d2c (diff) | |
| download | zig-6b99aab0eb25821d91c1708575cabdadc9079024.tar.gz zig-6b99aab0eb25821d91c1708575cabdadc9079024.zip | |
macho: do not assume exe or dylib when flushing module
| -rw-r--r-- | src/link/MachO.zig | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 8a8525ab19..0422a983dc 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -561,21 +561,26 @@ pub fn flushModule(self: *MachO, comp: *Compilation, prog_node: *std.Progress.No try self.writeLinkeditSegmentData(&ncmds, lc_writer); try load_commands.writeDylinkerLC(&ncmds, lc_writer); - if (self.base.options.output_mode == .Exe) blk: { - const seg_id = self.header_segment_cmd_index.?; - const seg = self.segments.items[seg_id]; - const global = self.getEntryPoint() catch |err| switch (err) { - error.MissingMainEntrypoint => { - self.error_flags.no_entry_point_found = true; - break :blk; - }, - else => |e| return e, - }; - const sym = self.getSymbol(global); - try load_commands.writeMainLC(@intCast(u32, sym.n_value - seg.vmaddr), &self.base.options, &ncmds, lc_writer); + switch (self.base.options.output_mode) { + .Exe => blk: { + const seg_id = self.header_segment_cmd_index.?; + const seg = self.segments.items[seg_id]; + const global = self.getEntryPoint() catch |err| switch (err) { + error.MissingMainEntrypoint => { + self.error_flags.no_entry_point_found = true; + break :blk; + }, + else => |e| return e, + }; + const sym = self.getSymbol(global); + try load_commands.writeMainLC(@intCast(u32, sym.n_value - seg.vmaddr), &self.base.options, &ncmds, lc_writer); + }, + .Lib => if (self.base.options.link_mode == .Dynamic) { + try load_commands.writeDylibIdLC(self.base.allocator, &self.base.options, &ncmds, lc_writer); + }, + else => {}, } - try load_commands.writeDylibIdLC(self.base.allocator, &self.base.options, &ncmds, lc_writer); try load_commands.writeRpathLCs(self.base.allocator, &self.base.options, &ncmds, lc_writer); { |
