aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-12-14 15:31:56 +0100
committerJakub Konka <kubkon@jakubkonka.com>2022-12-16 00:01:04 +0100
commit6b99aab0eb25821d91c1708575cabdadc9079024 (patch)
tree67b5ccbae476c438a2d91bbc4df982028efaf020
parent79457fc76a61695560e6314246b0a8c21a7e2d2c (diff)
downloadzig-6b99aab0eb25821d91c1708575cabdadc9079024.tar.gz
zig-6b99aab0eb25821d91c1708575cabdadc9079024.zip
macho: do not assume exe or dylib when flushing module
-rw-r--r--src/link/MachO.zig31
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);
{