motiejus/zig

fork of https://codeberg.org/ziglang/zig
git clone https://git.jakstys.lt/motiejus/zig.git
Log | Tree | Refs | README | LICENSE

commit 6b99aab0eb25821d91c1708575cabdadc9079024 (tree)
parent 79457fc76a61695560e6314246b0a8c21a7e2d2c
Author: Jakub Konka <kubkon@jakubkonka.com>
Date:   Wed, 14 Dec 2022 15:31:56 +0100

macho: do not assume exe or dylib when flushing module

Diffstat:
Msrc/link/MachO.zig | 31++++++++++++++++++-------------
1 file changed, 18 insertions(+), 13 deletions(-)

diff --git 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); {