Commit 09b46198ff

Jakub Konka <kubkon@jakubkonka.com>
2021-06-20 10:14:18
zld: move logic unpacking path to libc stub to Compilation
1 parent a600d41
Changed files (4)
src/link/MachO/Zld.zig
@@ -181,7 +181,7 @@ pub fn closeFiles(self: Zld) void {
 const LinkArgs = struct {
     libs: []const []const u8,
     rpaths: []const []const u8,
-    lib_system_path: []const u8,
+    libc_stub_path: []const u8,
 };
 
 pub fn link(self: *Zld, files: []const []const u8, out_path: []const u8, args: LinkArgs) !void {
@@ -223,7 +223,7 @@ pub fn link(self: *Zld, files: []const []const u8, out_path: []const u8, args: L
     try self.addRpaths(args.rpaths);
     try self.parseInputFiles(files);
     try self.parseLibs(args.libs);
-    try self.parseLibSystem(args.lib_system_path);
+    try self.parseLibSystem(args.libc_stub_path);
     try self.resolveSymbols();
     try self.resolveStubsAndGotEntries();
     try self.updateMetadata();
src/link/MachO.zig
@@ -848,9 +848,7 @@ fn linkWithLLD(self: *MachO, comp: *Compilation) !void {
             try zld.link(positionals.items, full_out_path, .{
                 .libs = libs.items,
                 .rpaths = rpaths.items,
-                .lib_system_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
-                    "libc", "darwin", "libSystem.B.tbd",
-                }),
+                .libc_stub_path = self.base.options.libc_stub_path.?,
             });
 
             break :outer;
src/Compilation.zig
@@ -919,6 +919,20 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {
             }
         };
 
+        const libc_stub_path: ?[]const u8 = if (options.target.isDarwin()) libc_stub: {
+            // TODO consider other platforms than Darwin which require linking against libc here.
+            const needs_libc_stub: bool = switch (options.output_mode) {
+                .Obj => false,
+                .Lib => if (options.link_mode) |mode| mode == .Dynamic else false,
+                .Exe => true,
+            };
+            if (needs_libc_stub) {
+                break :libc_stub try options.zig_lib_directory.join(arena, &[_][]const u8{
+                    "libc", "darwin", "libSystem.B.tbd",
+                });
+            } else break :libc_stub null;
+        } else null;
+
         const must_dynamic_link = dl: {
             if (target_util.cannotDynamicLink(options.target))
                 break :dl false;
@@ -1288,6 +1302,7 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {
             .use_lld = use_lld,
             .use_llvm = use_llvm,
             .system_linker_hack = darwin_options.system_linker_hack,
+            .libc_stub_path = libc_stub_path,
             .link_libc = link_libc,
             .link_libcpp = link_libcpp,
             .link_libunwind = link_libunwind,
src/link.zig
@@ -62,6 +62,9 @@ pub const Options = struct {
     /// Darwin-only. If this is true, `use_llvm` is true, and `is_native_os` is true, this link code will
     /// use system linker `ld` instead of the LLD.
     system_linker_hack: bool,
+    /// Path to Zig-hosted libc stub file.
+    /// On Darwin, this is a path to libSystem.B.tbd stub file.
+    libc_stub_path: ?[]const u8,
     link_libc: bool,
     link_libcpp: bool,
     link_libunwind: bool,