Commit 67f11190d1

Andrew Kelley <superjoe30@gmail.com>
2018-03-31 22:34:55
musl-friendly dynamic linking
1 parent eb6ff79
Changed files (2)
src/link.cpp
@@ -164,32 +164,45 @@ static void add_rpath(LinkJob *lj, Buf *rpath) {
     lj->rpath_table.put(rpath, true);
 }
 
+static Buf *try_dynamic_linker_path(const char *ld_name) {
+    const char *cc_exe = getenv("CC");
+    cc_exe = (cc_exe == nullptr) ? "cc" : cc_exe;
+    ZigList<const char *> args = {};
+    args.append(buf_ptr(buf_sprintf("-print-file-name=%s", ld_name)));
+    Termination term;
+    Buf *out_stderr = buf_alloc();
+    Buf *out_stdout = buf_alloc();
+    int err;
+    if ((err = os_exec_process(cc_exe, args, &term, out_stderr, out_stdout))) {
+        return nullptr;
+    }
+    if (term.how != TerminationIdClean || term.code != 0) {
+        return nullptr;
+    }
+    if (buf_ends_with_str(out_stdout, "\n")) {
+        buf_resize(out_stdout, buf_len(out_stdout) - 1);
+    }
+    if (buf_len(out_stdout) == 0 || buf_eql_str(out_stdout, ld_name)) {
+        return nullptr;
+    }
+    return out_stdout;
+}
+
 static Buf *get_dynamic_linker_path(CodeGen *g) {
     if (g->is_native_target && g->zig_target.arch.arch == ZigLLVM_x86_64) {
-        const char *cc_exe = getenv("CC");
-        cc_exe = (cc_exe == nullptr) ? "cc" : cc_exe;
-        ZigList<const char *> args = {};
-        args.append("-print-file-name=ld-linux-x86-64.so.2");
-        Termination term;
-        Buf *out_stderr = buf_alloc();
-        Buf *out_stdout = buf_alloc();
-        int err;
-        if ((err = os_exec_process(cc_exe, args, &term, out_stderr, out_stdout))) {
-            return target_dynamic_linker(&g->zig_target);
-        }
-        if (term.how != TerminationIdClean || term.code != 0) {
-            return target_dynamic_linker(&g->zig_target);
-        }
-        if (buf_ends_with_str(out_stdout, "\n")) {
-            buf_resize(out_stdout, buf_len(out_stdout) - 1);
-        }
-        if (buf_len(out_stdout) == 0 || buf_eql_str(out_stdout, "ld-linux-x86-64.so.2")) {
-            return target_dynamic_linker(&g->zig_target);
+        static const char *ld_names[] = {
+            "ld-linux-x86-64.so.2",
+            "ld-musl-x86_64.so.1",
+        };
+        for (size_t i = 0; i < array_length(ld_names); i += 1) {
+            const char *ld_name = ld_names[i];
+            Buf *result = try_dynamic_linker_path(ld_name);
+            if (result != nullptr) {
+                return result;
+            }
         }
-        return out_stdout;
-    } else {
-        return target_dynamic_linker(&g->zig_target);
     }
+    return target_dynamic_linker(&g->zig_target);
 }
 
 static void construct_linker_job_elf(LinkJob *lj) {
build.zig
@@ -45,6 +45,11 @@ pub fn build(b: &Builder) !void {
 
     var exe = b.addExecutable("zig", "src-self-hosted/main.zig");
     exe.setBuildMode(mode);
+
+    // This is for finding /lib/libz.a on alpine linux.
+    // TODO turn this into -Dextra-lib-path=/lib option
+    exe.addLibPath("/lib");
+
     exe.addIncludeDir("src");
     exe.addIncludeDir(cmake_binary_dir);
     addCppLib(b, exe, cmake_binary_dir, "zig_cpp");