<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/79715>79715</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[LLD] [COFF] Linking against dllimported emulated TLS variables fails with LTO
</td>
</tr>
<tr>
<th>Labels</th>
<td>
lld:COFF
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
mstorsjo
</td>
</tr>
</table>
<pre>
LLD fails to link against a DLL that exports emulated TLS variables, when using LTO.
`tlslib.c`:
```c
int __thread libdata;
void libfunc(void) {
libdata++;
}
```
`tlsmain.c`:
```c
void libfunc(void);
extern int __thread libdata;
int main(int argc, char **argv) {
libfunc();
return libdata;
}
```
```console
$ x86_64-w64-mingw32-clang tlslib.c -shared -o tlslib.dll -Wl,--out-implib=tlslib.lib -femulated-tls
$ llvm-readobj --coff-exports tlslib.dll
Export {
Ordinal: 1
Name: __emutls_v.libdata
RVA: 0x5008
}
Export {
Ordinal: 2
Name: libfunc
RVA: 0x1410
}
$ x86_64-w64-mingw32-clang tlsmain.c tlslib.lib -o tlsmain.exe -femulated-tls # successfully links
$ x86_64-w64-mingw32-clang tlsmain.c tlslib.lib -o tlsmain.exe -femulated-tls -flto # fails
ld.lld: error: undefined symbol: libdata
>>> referenced by tlsmain.c
>>> /tmp/tlsmain-827542.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```
Since a23bf1786be7c0738a4cf999c2957155bb32d5af and 5c92c9f34a7dba804479acef62c576d1a170ef1f (past the 17.x branch, only available in 18.x and git main), passing `-femulated-tls` together with `-flto` when linking (in particular, if compiling and linking in separate steps, these two options need to be passed when linking too!) should tell the LTO code generation to use emulatd TLS.
However, despite that, the pre-LTO symbol resolution step in LLD fails, as it has an undefined reference to `libdata` (as it seems on the LTO object level), while the import library only provides `https://github.com/llvm/llvm-project/blob/llvmorg-17.0.6/lld/COFF/Driver.cpp#L2374-L2379
Even if skipping that step, compilation fails, since after LTO compilation, we have an undefined reference to `__emutls_v.libdata`, while the import library only provides `__imp___emutls_v.libdata`. The MinGW auto import steps in https://github.com/llvm/llvm-project/blob/llvmorg-17.0.6/lld/COFF/Driver.cpp#L2370 would need to run after the LTO compilation in this case.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8Vk2P47wN_jXKhbBhy1_xIYeZzaY9pB2g76DvMZBl2tauLBmSnGT-fSHZSWZnP9o99B0Ynpii-JAPKVLMWtErxB0pnkmx37DZDdrsRuu0sV_0ptHt2-543EPHhLTgNEihvgLrmVDWAYP98QhuYA7wOmnjLOA4S-awhdfjH3BmRrBGoiX0E1wGVDBboXo4vr7EJNmT5Gl9l4mTVoom5qRMSPYQLw9fvoVycDq5wSBrQYqmZY6R7HlZPGsRhN2sOKFb_0loDaRa1-G-gz7757aPVPsPaO99GplQv3bqx7h383h1aBT80nW_6IEI3fqfzPTcE8YHZoDQJ0KfmOnP30ezQr6HAzDoZqO-w_hpmB-C0spqiauU5nDdlqcyjy5lHo1C9ZeMRlwy1cMtYRDZgRlsIdI3WSslRH9KQj9FkZ5dJMZJioZk-3Vdigai7lYpkZP2gSfleYw8S7r5AlHEdddFt9p6mF_0Pwf5e1JeTCsUkyR7gvQm-ycb0QtOJxxnJ-3pHN_IWTX-9e8nr5BciyTZ3umC_wGErkp3kDUr8J3pNE-Tj5n4L_QutQfvSdN3OV7xA4dAaAZ25hyt7WYp38JZtf8frKiTTgfE0BkWENnGUrY-XjRGG_9jVi12QmEL9m1stFw5erBPss_LAwY7NKg4ttC8PXz6qPbtH6EHN07-vehHW1oVOY31si3E941DnhM0wPU4MtUG77GFi3AD4FU44LpFSIHQ7WwRorPveRYRhDprzpzQyh-3n5-kP4TiCIxmTZdW27LBiidVtmU57-q65rQuqrQomiajbcE68D4UvKa87rKcVW3DtkmeVzXj2JWUF1XZpiytEuzSzjs1MevADQhpFV-hMUzxwfcKreQbsDMT0vdbEArSbXwN5ntx6y6115x8z1c9kDL5cAbLBJzu0Q1oFkKCinTar4Tu7ckLe32jgokZJ_gsmfF2RedJnYT0Ch73piwUWJyYYQ7BOpzCMHADWgR30aAnT6oFhdh6shsMLvqkvId0WhOa-h5oBz3LFhxKGZg4vr4sWetRoQkp8nZ8-pbwwiz6Zt78XV_wjMHtFu0kHIYhtjoGk8HIW11KFgxaLedg1_vvA7qPRL-FWRAOBmaBqXcFf69n7w0pk1vZl4nnb9lkEUcL3uE1EN18Qe5A4hnlmrDLICQGBTGGViRFY5h5W3I-GX0WLVqPMDg3WT-o6IHQQy_cMDcx1yOhB99W13_RZLQHIfTQSN2sUm36KK3iJC6DoCX08Onl4O3sjTijifk0EZodaVblkX_X7wn9fEblK8B-FdMU0uXvBJ6tMMhCXSyZubNml4PSOTRrCu9KIWqEgZ3x15T-oKWXye9xdjqJcTr90FAMrwPCP4T625_AZqdvtkIR-yr4i_hO4BIq_nZCzKxW3h7l_yBY-GISFjizGG_aXdbWWc02uEurpMzqLaX1Zth12y6r87apyiop6yItkrLb8qrLyrKqkpxuxI4mNE9SWtEsS2gdFxWraN1lSY2825YZyRMcmZCxjybWpt8Ia2fcVXWVFhvJGpQ2XCspXYbCEh7110yzC8Q0c29JnkhhnX2YccLJcCE9Hvek2AMpnsPWYg_HtRnc7p-tlEtOsP3JxXO9uIZ2dnx92cxG7n47bSEwS-ghxPafAAAA__-4UYXa">