aboutsummaryrefslogtreecommitdiff
path: root/src/link
diff options
context:
space:
mode:
authorMotiejus Jakštys <motiejus@uber.com>2023-05-23 10:50:15 +0300
committerJakub Konka <kubkon@jakubkonka.com>2023-05-30 08:18:10 +0200
commitac9f72d87e8eeb4a9d0dead80b61420485279ddd (patch)
tree63046c79edfb445d0eef7092d695ab1646655061 /src/link
parent706bdf6512aec9f5d003cc2ec64ba16ac0a202dc (diff)
downloadzig-ac9f72d87e8eeb4a9d0dead80b61420485279ddd.tar.gz
zig-ac9f72d87e8eeb4a9d0dead80b61420485279ddd.zip
zig ld: handle `--library :path/to/lib.so`
`-l :path/to/lib.so` behavior on gcc/clang is: - the path is recorded as-is: no paths, exact filename (`libX.so.Y`). - no rpaths. The previous version removed the `:` and pretended it's a positional argument to the linker. That works in almost all cases, except in how rules_go[1] does things (the Bazel wrapper for Go). Test case in #15743, output: gcc rpath: 0x0000000000000001 (NEEDED) Shared library: [libversioned.so.2] 0x000000000000001d (RUNPATH) Library runpath: [$ORIGIN/x] gcc plain: 0x0000000000000001 (NEEDED) Shared library: [libversioned.so.2] zig cc rpath: 0x0000000000000001 (NEEDED) Shared library: [libversioned.so.2] 0x000000000000001d (RUNPATH) Library runpath: [$ORIGIN/x] zig cc plain: 0x0000000000000001 (NEEDED) Shared library: [libversioned.so.2] Fixes #15743 [1]: https://github.com/bazelbuild/rules_go
Diffstat (limited to 'src/link')
-rw-r--r--src/link/Coff/lld.zig2
-rw-r--r--src/link/Elf.zig10
-rw-r--r--src/link/MachO/zld.zig2
-rw-r--r--src/link/Wasm.zig4
4 files changed, 13 insertions, 5 deletions
diff --git a/src/link/Coff/lld.zig b/src/link/Coff/lld.zig
index 656b0f9a97..6be20efe11 100644
--- a/src/link/Coff/lld.zig
+++ b/src/link/Coff/lld.zig
@@ -63,7 +63,7 @@ pub fn linkWithLLD(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Nod
man = comp.cache_parent.obtain();
self.base.releaseLock();
- comptime assert(Compilation.link_hash_implementation_version == 8);
+ comptime assert(Compilation.link_hash_implementation_version == 9);
for (self.base.options.objects) |obj| {
_ = try man.addFile(obj.path, null);
diff --git a/src/link/Elf.zig b/src/link/Elf.zig
index 9fa48a9e62..2a28f880ac 100644
--- a/src/link/Elf.zig
+++ b/src/link/Elf.zig
@@ -1371,13 +1371,14 @@ fn linkWithLLD(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node) !v
// We are about to obtain this lock, so here we give other processes a chance first.
self.base.releaseLock();
- comptime assert(Compilation.link_hash_implementation_version == 8);
+ comptime assert(Compilation.link_hash_implementation_version == 9);
try man.addOptionalFile(self.base.options.linker_script);
try man.addOptionalFile(self.base.options.version_script);
for (self.base.options.objects) |obj| {
_ = try man.addFile(obj.path, null);
man.hash.add(obj.must_link);
+ man.hash.add(obj.loption);
}
for (comp.c_object_table.keys()) |key| {
_ = try man.addFile(key.status.success.object_path, null);
@@ -1719,6 +1720,8 @@ fn linkWithLLD(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node) !v
for (self.base.options.objects) |obj| {
if (Compilation.classifyFileExt(obj.path) == .shared_library) {
const lib_dir_path = std.fs.path.dirname(obj.path) orelse continue;
+ if (obj.loption) continue;
+
if ((try rpath_table.fetchPut(lib_dir_path, {})) == null) {
try argv.append("-rpath");
try argv.append(lib_dir_path);
@@ -1767,6 +1770,11 @@ fn linkWithLLD(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node) !v
try argv.append("-no-whole-archive");
whole_archive = false;
}
+
+ if (obj.loption) {
+ assert(obj.path[0] == ':');
+ try argv.append("-l");
+ }
try argv.append(obj.path);
}
if (whole_archive) {
diff --git a/src/link/MachO/zld.zig b/src/link/MachO/zld.zig
index b151aee19b..4f7e615c79 100644
--- a/src/link/MachO/zld.zig
+++ b/src/link/MachO/zld.zig
@@ -3494,7 +3494,7 @@ pub fn linkWithZld(macho_file: *MachO, comp: *Compilation, prog_node: *std.Progr
// We are about to obtain this lock, so here we give other processes a chance first.
macho_file.base.releaseLock();
- comptime assert(Compilation.link_hash_implementation_version == 8);
+ comptime assert(Compilation.link_hash_implementation_version == 9);
for (options.objects) |obj| {
_ = try man.addFile(obj.path, null);
diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig
index 5dfc91d4ce..befd2d68c9 100644
--- a/src/link/Wasm.zig
+++ b/src/link/Wasm.zig
@@ -3150,7 +3150,7 @@ fn linkWithZld(wasm: *Wasm, comp: *Compilation, prog_node: *std.Progress.Node) l
// We are about to obtain this lock, so here we give other processes a chance first.
wasm.base.releaseLock();
- comptime assert(Compilation.link_hash_implementation_version == 8);
+ comptime assert(Compilation.link_hash_implementation_version == 9);
for (options.objects) |obj| {
_ = try man.addFile(obj.path, null);
@@ -4199,7 +4199,7 @@ fn linkWithLLD(wasm: *Wasm, comp: *Compilation, prog_node: *std.Progress.Node) !
// We are about to obtain this lock, so here we give other processes a chance first.
wasm.base.releaseLock();
- comptime assert(Compilation.link_hash_implementation_version == 8);
+ comptime assert(Compilation.link_hash_implementation_version == 9);
for (wasm.base.options.objects) |obj| {
_ = try man.addFile(obj.path, null);