<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/94958>94958</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[lld] --relocatable library search prefers shared objects over archives leading to errors
</td>
</tr>
<tr>
<th>Labels</th>
<td>
lld
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
paparodeo
</td>
</tr>
</table>
<pre>
```
$ lld -r test.o -o test -L./libs -ltest
lld: error: attempted static link of dynamic object ./libs/libtest.so
```
fails when both `libtest.a` and `libtest.so` exist
the following patch fixes the search path:
```diff
diff --git a/lld/ELF/DriverUtils.cpp b/lld/ELF/DriverUtils.cpp
index ac7460440..0ebf48be2 100644
--- a/lld/ELF/DriverUtils.cpp
+++ b/lld/ELF/DriverUtils.cpp
@@ -233,11 +233,9 @@ std::optional<std::string> elf::findFromSearchPaths(StringRef path) {
// This is for -l<basename>. We'll look for lib<basename>.so or lib<basename>.a from
// search paths.
std::optional<std::string> elf::searchLibraryBaseName(StringRef name) {
+ const char * const sfx = config->isStatic || config->relocatable ? ".a" : ".so";
for (StringRef dir : config->searchPaths) {
- if (!config->isStatic)
- if (std::optional<std::string> s = findFile(dir, "lib" + name + ".so"))
- return s;
- if (std::optional<std::string> s = findFile(dir, "lib" + name + ".a"))
+ if (std::optional<std::string> s = findFile(dir, "lib" + name + sfx))
return s;
}
return std::nullopt;
```
test:
```console
$ echo void empty(void) { } > test.c
$ clang test.c -c
$ ar rc libs/libtest.a test.o
# this works
$ lld -r test.o -o test -L./libs -ltest
# but create a shared lib
clang test.c --shared -o libs/libtest.so
# this fails without patch
$ lld -r test.o -o test -L./libs -ltest
lld: error: attempted static link of dynamic object ./libs/libtest.so
# succeeds with patch
$ lld -r test.o -o test -L./libs -ltest
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVkFv6zYM_jXKhbAhy07cHHxomub0MAx7G3aWJTrWqliBqKTtvx8kO4nTPmxvGx6wwIglkhI_kjI_SSKzHxAbttyw5XYhT6F3vjnKo_ROo1u0Tr83bMWnh28Zf2SiAms1ZB4CUsgdZC6NIPuSM7GzpiXIbJSMC6zVrHwE9N75OJAh4OEYUAMFGYwCa4YXcB3o90EejALX_oEqwGWz8ZV8kZsw3EPqpLEErz0O0LrQA1vxywrJVhzkoOcyclGIb-aCcPwPPULnrHWvZtjDUQbVQ2fekCBqCKVXfRT3rHz8AEObrhtFcQRZtjcBZARuNRO75y87JnZbb87ofwvGUq6OR2j_Wj_uZwaNbyBVXa14VfE859h21UOLAgrOV1U1mmVZ9nf-LtXbjM_3uWcVZxWHTJQlE09FAUxsxvEaJh2FWF5WPrpjMG6QlpVPVxkFb4Y9K58BbTeKOjPonXeHrymhP8vQExMPX5PhL9iNGRZrYPVmxABMRHzwa28IDEHnPGTRSysJB3lAVj7n8DsyUVsL1rmXZGJN-8GGHHxTLqHz7nDvbFZuyifVP4103OOLab307xtJ-FN0OI81IZjHGgsDyg0UQPXSAxOP05S6N2DlNs46s89Y-Wzo6_j9sPqJ1U8zjUfrlAyytQis3AETIpdMCIifX5yQY0Kw8pJgSAm7Q6aNT9a3TWlerxnkDADAdHE5E8VneEysL4aj1XemkVK46bQYG9OmjWfiKeKPJYzRiE3KYBrcwhLrmcvp5zGc_AB0jXmG-sfhkR_gpOr-WLfUvc09fg4cAFi9vY4v-ovj4WStO4ar-cfmP--XscN_aoXxtDqLN65A1Ts4O6Mhdv13Jh7iZDpCEQvEMFNjVrdVysphP0khmymkBx8p444X5ERFdyBFCSG2jFfnX-hfctdtq_YUQHmUAUEC9dKjTq0kGdyjzSZ15j7ipG8jnPjLhN6dwsg8_yOuvWKlk1KIekT6n2BeT8tCN6Vel2u5wKaoiwderGpRL_qmXEmOKKpSFe0KVV0IXWuUUnZSFbLsFqYRXFR8VfCCLwWvc1Sl1MuSq2W9EtVqySqOB2lsbu35kDu_XxiiEzbrar18WFjZoqV08REi0aCINyDfROusPe2JVdwaCnRbH0yw6a4U7ZdbyLJ5o7Vjn78yh8cOPV2OyphnAndGD9HAnJHAotTxshHcWDJanLxt-hCOFL-sREV7E_pTmyt3SIR9vryyo3dxTyZ2KbBYuzG2cyP-DAAA__9T8PBo">