aboutsummaryrefslogtreecommitdiff
path: root/src/link.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-07-08 13:51:48 -0400
committerGitHub <noreply@github.com>2019-07-08 13:51:48 -0400
commit4953e84902df3467b6d7491532e48bf33b5e56b9 (patch)
treeaa7d7fcb91a0e6ca8725d3fbdd586e168f62a27f /src/link.cpp
parentd39dcd6d9db2faf18287b2ff734ffda0d4080e5a (diff)
parent201033d83b80d65380aaade37b76eafa17258f16 (diff)
downloadzig-4953e84902df3467b6d7491532e48bf33b5e56b9.tar.gz
zig-4953e84902df3467b6d7491532e48bf33b5e56b9.zip
Merge pull request #2847 from ziglang/glibc-abi-versioning
support glibc version as part of the target
Diffstat (limited to 'src/link.cpp')
-rw-r--r--src/link.cpp79
1 files changed, 31 insertions, 48 deletions
diff --git a/src/link.cpp b/src/link.cpp
index 401f477760..7b41f3b556 100644
--- a/src/link.cpp
+++ b/src/link.cpp
@@ -11,6 +11,7 @@
#include "analyze.hpp"
#include "compiler.hpp"
#include "install_files.h"
+#include "glibc.hpp"
struct LinkJob {
CodeGen *codegen;
@@ -19,37 +20,6 @@ struct LinkJob {
HashMap<Buf *, bool, buf_hash, buf_eql_buf> rpath_table;
};
-static CodeGen *create_child_codegen(CodeGen *parent_gen, Buf *root_src_path, OutType out_type,
- ZigLibCInstallation *libc)
-{
- CodeGen *child_gen = codegen_create(nullptr, root_src_path, parent_gen->zig_target, out_type,
- parent_gen->build_mode, parent_gen->zig_lib_dir, parent_gen->zig_std_dir, libc, get_stage1_cache_path());
- child_gen->disable_gen_h = true;
- child_gen->want_stack_check = WantStackCheckDisabled;
- child_gen->verbose_tokenize = parent_gen->verbose_tokenize;
- child_gen->verbose_ast = parent_gen->verbose_ast;
- child_gen->verbose_link = parent_gen->verbose_link;
- child_gen->verbose_ir = parent_gen->verbose_ir;
- child_gen->verbose_llvm_ir = parent_gen->verbose_llvm_ir;
- child_gen->verbose_cimport = parent_gen->verbose_cimport;
- child_gen->verbose_cc = parent_gen->verbose_cc;
- child_gen->llvm_argv = parent_gen->llvm_argv;
- child_gen->dynamic_linker_path = parent_gen->dynamic_linker_path;
-
- codegen_set_strip(child_gen, parent_gen->strip_debug_symbols);
- child_gen->want_pic = parent_gen->have_pic ? WantPICEnabled : WantPICDisabled;
- child_gen->valgrind_support = ValgrindSupportDisabled;
-
- codegen_set_errmsg_color(child_gen, parent_gen->err_color);
-
- codegen_set_mmacosx_version_min(child_gen, parent_gen->mmacosx_version_min);
- codegen_set_mios_version_min(child_gen, parent_gen->mios_version_min);
-
- child_gen->enable_cache = true;
-
- return child_gen;
-}
-
static const char *build_libc_object(CodeGen *parent_gen, const char *name, CFile *c_file) {
CodeGen *child_gen = create_child_codegen(parent_gen, nullptr, OutTypeObj, nullptr);
codegen_set_out_name(child_gen, buf_create_from_str(name));
@@ -76,18 +46,6 @@ static const char *path_from_libunwind(CodeGen *g, const char *subpath) {
return path_from_zig_lib(g, "libunwind", subpath);
}
-static const char *build_dummy_so(CodeGen *parent, const char *name, size_t major_version) {
- Buf *glibc_dummy_root_src = buf_sprintf("%s" OS_SEP "libc" OS_SEP "dummy" OS_SEP "%s.zig",
- buf_ptr(parent->zig_lib_dir), name);
- CodeGen *child_gen = create_child_codegen(parent, glibc_dummy_root_src, OutTypeLib, nullptr);
- codegen_set_out_name(child_gen, buf_create_from_str(name));
- codegen_set_lib_version(child_gen, major_version, 0, 0);
- child_gen->is_dynamic = true;
- child_gen->is_dummy_so = true;
- codegen_build_and_link(child_gen);
- return buf_ptr(&child_gen->output_file_path);
-}
-
static const char *build_libunwind(CodeGen *parent) {
CodeGen *child_gen = create_child_codegen(parent, nullptr, OutTypeLib, nullptr);
codegen_set_out_name(child_gen, buf_create_from_str("unwind"));
@@ -892,6 +850,30 @@ static void add_rpath(LinkJob *lj, Buf *rpath) {
lj->rpath_table.put(rpath, true);
}
+static void add_glibc_libs(LinkJob *lj) {
+ Error err;
+ ZigGLibCAbi *glibc_abi;
+ if ((err = glibc_load_metadata(&glibc_abi, lj->codegen->zig_lib_dir, true))) {
+ fprintf(stderr, "%s\n", err_str(err));
+ exit(1);
+ }
+
+ Buf *artifact_dir;
+ if ((err = glibc_build_dummies_and_maps(lj->codegen, glibc_abi, lj->codegen->zig_target,
+ &artifact_dir, true)))
+ {
+ fprintf(stderr, "%s\n", err_str(err));
+ exit(1);
+ }
+
+ size_t lib_count = glibc_lib_count();
+ for (size_t i = 0; i < lib_count; i += 1) {
+ const ZigGLibCLib *lib = glibc_lib_enum(i);
+ Buf *so_path = buf_sprintf("%s" OS_SEP "lib%s.so.%d.0.0", buf_ptr(artifact_dir), lib->name, lib->sover);
+ lj->args.append(buf_ptr(so_path));
+ }
+}
+
static void construct_linker_job_elf(LinkJob *lj) {
CodeGen *g = lj->codegen;
@@ -990,6 +972,11 @@ static void construct_linker_job_elf(LinkJob *lj) {
if (is_dyn_lib) {
lj->args.append("-soname");
lj->args.append(buf_ptr(soname));
+
+ if (g->version_script_path != nullptr) {
+ lj->args.append("-version-script");
+ lj->args.append(buf_ptr(g->version_script_path));
+ }
}
// .o files
@@ -1053,11 +1040,7 @@ static void construct_linker_job_elf(LinkJob *lj) {
}
} else if (target_is_glibc(g->zig_target)) {
lj->args.append(build_libunwind(g));
- lj->args.append(build_dummy_so(g, "c", 6));
- lj->args.append(build_dummy_so(g, "m", 6));
- lj->args.append(build_dummy_so(g, "pthread", 0));
- lj->args.append(build_dummy_so(g, "dl", 2));
- lj->args.append(build_dummy_so(g, "rt", 1));
+ add_glibc_libs(lj);
lj->args.append(get_libc_crt_file(g, "libc_nonshared.a"));
} else if (target_is_musl(g->zig_target)) {
lj->args.append(build_libunwind(g));