diff options
| author | Motiejus Jakštys <motiejus@uber.com> | 2023-05-23 10:50:15 +0300 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-05-30 08:18:10 +0200 |
| commit | ac9f72d87e8eeb4a9d0dead80b61420485279ddd (patch) | |
| tree | 63046c79edfb445d0eef7092d695ab1646655061 /src/link | |
| parent | 706bdf6512aec9f5d003cc2ec64ba16ac0a202dc (diff) | |
| download | zig-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.zig | 2 | ||||
| -rw-r--r-- | src/link/Elf.zig | 10 | ||||
| -rw-r--r-- | src/link/MachO/zld.zig | 2 | ||||
| -rw-r--r-- | src/link/Wasm.zig | 4 |
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); |
