aboutsummaryrefslogtreecommitdiff
path: root/src/link.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2018-03-30 17:10:54 -0400
committerAndrew Kelley <superjoe30@gmail.com>2018-03-30 17:10:54 -0400
commitb01c50d6fae581050affdc438942b979ae54a8da (patch)
treee0e2dba4af0bdb76f070b4391a5e22f47b471373 /src/link.cpp
parentf586acabdcc4adaeda7bc278463c20e4033e8cc9 (diff)
downloadzig-b01c50d6fae581050affdc438942b979ae54a8da.tar.gz
zig-b01c50d6fae581050affdc438942b979ae54a8da.zip
find libc and zig std lib at runtime
this removes the following configure options: * ZIG_LIBC_LIB_DIR * ZIG_LIBC_STATIC_LIB_DIR * ZIG_LIBC_INCLUDE_DIR * ZIG_DYNAMIC_LINKER * ZIG_EACH_LIB_RPATH * zig's reliance on CMAKE_INSTALL_PREFIX these options are still available as command line options, however, the default will attempt to execute the system's C compiler to collect system defaults for these values. closes #870
Diffstat (limited to 'src/link.cpp')
-rw-r--r--src/link.cpp44
1 files changed, 38 insertions, 6 deletions
diff --git a/src/link.cpp b/src/link.cpp
index f0537ffa0f..57fa59b675 100644
--- a/src/link.cpp
+++ b/src/link.cpp
@@ -164,6 +164,34 @@ static void add_rpath(LinkJob *lj, Buf *rpath) {
lj->rpath_table.put(rpath, true);
}
+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);
+ }
+ return out_stdout;
+ } else {
+ return target_dynamic_linker(&g->zig_target);
+ }
+}
+
static void construct_linker_job_elf(LinkJob *lj) {
CodeGen *g = lj->codegen;
@@ -259,12 +287,16 @@ static void construct_linker_job_elf(LinkJob *lj) {
lj->args.append(buf_ptr(g->libc_static_lib_dir));
}
- if (g->dynamic_linker && buf_len(g->dynamic_linker) > 0) {
- lj->args.append("-dynamic-linker");
- lj->args.append(buf_ptr(g->dynamic_linker));
- } else {
- lj->args.append("-dynamic-linker");
- lj->args.append(buf_ptr(target_dynamic_linker(&g->zig_target)));
+ if (!g->is_static) {
+ if (g->dynamic_linker != nullptr) {
+ assert(buf_len(g->dynamic_linker) != 0);
+ lj->args.append("-dynamic-linker");
+ lj->args.append(buf_ptr(g->dynamic_linker));
+ } else {
+ Buf *resolved_dynamic_linker = get_dynamic_linker_path(g);
+ lj->args.append("-dynamic-linker");
+ lj->args.append(buf_ptr(resolved_dynamic_linker));
+ }
}
if (shared) {