<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">