<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/59874>59874</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
lld::elf::link returns false from the second time on its called
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
fwinter
</td>
</tr>
</table>
<pre>
Using LLVM with JIT-compilation requires for some target architectures to call the linker several times, i.e. for AMD GPU kernels to turn an `.o` file into an `.so` file.
LLVM 15 and also the current code have the following problem:
`bool lld::elf::link` returns `false` from the second time on its called. I.e. the first call works fine, but subsequent calls fail.
Here's small reproducer:
```
#include "lld/Common/Driver.h"
#include "lld/Common/ErrorHandler.h"
#include "lld/Common/Memory.h"
#include <iostream>
int main()
{
std::cout << "First call ... ";
bool call_a = lld::elf::link( { "ld.lld" , "-shared" , "../kernel.o" , "-o" , "../kernel.so" } , llvm::outs(), llvm::errs(), true, true);
std::cout << call_a << std::endl;
std::cout << "Second call ... ";
bool call_b = lld::elf::link( { "ld.lld" , "-shared" , "../kernel.o" , "-o" , "../kernel.so" } , llvm::outs(), llvm::errs(), true, true);
std::cout << call_b << std::endl;
}
```
I tested various systems but the output is always:
First call ... 1
Second call ... 0
This behavior is agnostic to the architecture. Initially I ran into this with AMDGPU objects, but could reproduce with X86 objects.
A quick gdb session reveals that during the second call the link procedure is aborted here:
./llvm-project/lld/ELF/Driver.cpp:2624
```
// Return if there were name resolution errors.
if (errorCount())
return;
```
Please help.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkVlFv2zgM_jXKCzHDkZPYechD1iy3HlZguNsO93aQbTrWVZYyUkrQf3-QnKRJt259P6BQLZKi-JHUxyhmvbOIKzF_L-abiQq-d7Tqjtp6pEnt2qfVV9Z2B58-_fUAR-17-P3-y7vGDXttlNfOAuG3oAkZOkfAbkDwinboQVHTa4-ND1HrHTTKGPA9gtH2EQkYD0jKgNcDspB3oDPMkpv1wwZ--_wVHpEsmnTYB7KgLIhFnjmxyKHTBkFb785SvogzkW9Evh7XFPl0Dsq2oAy7FEETiNB6aFyL0KsDJmnnjHHHCHdPrjY4iGJ97Uos8to5A8a0UVOs0XTjR0QUbyeMcXKMp1OGMUVEbkjuGRtn2wQXnAXtOaUE2wzuI_IUgib2Y6aOjh4ZOm0x5qYOHjjUjN9CClwZw9ApbU5gPyKhkCUDD_Ew4Z5cGxqk7zGc_satLLRtTGgRhJQRmNzeuWFwVsjthvQBKeuFlG-w_kDk6KOyrXn7mQccHD29Yl3caceeUA2i-HCNQVsPg9JWyErI5UlTvh8_gP2pOo0LPnoRxV28evuc2izLokQU5zOQ6hp1_ygQxea1EssKRPk-AWmzhEVCrI6Q8h33ivBakmVCbscWzty1pXvFiEdFuUlKYw7DeLULnk9Yb-RIdCX3FPD5__IK3A8zcgGbdhcTtK25HL1eX3EjpPxz7OtfZrb-P2W2_kVmy83PXmVa78Eje2zhoEi7wMBP7HHgxAWRLFzw--BBMyhzVE98eeovWn06Sl_W6eayL71mqLFXB-0oudxZx143iXx7vKHzDO6t9loZ8wT3QMqOROyjjzQk1g-byN-u_hcbz2f-alww7TM1jaZ_V4uz3Q1vr-Fb0M0j7NoaGJnHWXNAFedBrzy0gSJVXzHrzYCJHN5gGwgTmtpRTGUfafKWEWObxMq_25OLYaRtZKkPn7bPJNjs96JYy4Wc_aRuAELGM_BHmgOguxgOIRzjYtWAQMjOhDQ5MRLmGTREYyGrJLxzwfpz_50I7jRbXr7N2wA-G1SM0KPZn_xO2lXRLoulmuBquiiLaV7NimrSr5oFlvlUym46rYoqr9rlrJ1Py7pquq7sqmqiVzKXRT7Ny-lC5kWVdfP5rCmrZTetl5VcKjHLcYgTKGYvc7SbaOaAq_myKmcTo2o0nH5ZSGnxCEkZuWG-mdAqZbwOOxaz3Gj2_OzFa29w9WOeuEzYNF7fMFsngcyq936fXkeqzk77PtRZ44ZT5b9vgBQrC7lNWP4LAAD__-LVvPU">