<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/128706>128706</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
lld-link.exe fails to find DATA imports without __declspec(dllimport)
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
stasoid
</td>
</tr>
</table>
<pre>
clang/lld-link version: 19.1.0.
This issue was encountered while porting Ladybird to Windows. Ladybird discord discussions: [one](https://discord.com/channels/1247070541085671459/1306918361732616212/1339658967214723112) [two](https://discord.com/channels/1247070541085671459/1306918361732616212/1343462676839530538).
If data item (global or class static variable) is imported, lld-link refuses to link it unless `__declspec(dllimport)` is specified. Functions (global and member functions) don't have this problem. See also: [WINDOWS_EXPORT_ALL_SYMBOLS](https://cmake.org/cmake/help/latest/prop_tgt/WINDOWS_EXPORT_ALL_SYMBOLS.html) in CMake.
I don't know if it is a bug or a feature, I could not find a similar issue. Is lld-link intentionally matches the behavior of Visual Studio link.exe here? It would be great if it behaved like on Linux instead. This is just confusing.
Simplified reproduction:
mylib.h:
```cpp
struct A
{
static int static_member; // error
void member_function(); // OK
};
extern int global; // error
void global_function(); // OK
```
mylib.cpp:
```cpp
#include "mylib.h"
int global;
int A::static_member;
void global_function()
{
}
void A::member_function()
{
}
```
myprog.cpp:
```cpp
#include "mylib.h"
int main()
{
global = 1;
global_function();
A::static_member = 1;
A().member_function();
}
```
build.bat:
```cmd
:: create dll.o
clang -c mylib.cpp
:: create exports.def
echo mylib.o > objs
cmake -E __create_def exports.def objs
:: create mylib.dll and mylib.lib
lld-link mylib.o /dll libcmt.lib /DEF:exports.def
:: create myprog.o
clang -c myprog.cpp
:: create myprog.exe
lld-link myprog.o mylib.lib libcmt.lib
```
The last command fails with these errors:
```
lld-link: error: undefined symbol: int global
>>> referenced by myprog.o:(main)
lld-link: error: undefined symbol: public: static int A::static_member
>>> referenced by myprog.o:(main)
```
The def/lib/dll export all 4 symbols:
```
> cat exports.def
EXPORTS
?global@@3HA DATA
?static_member@A@@2HA DATA
?global_function@@YAXXZ
?member_function@A@@QEAAXXZ
> dumpbin /exports mylib.lib
(some output skipped)
?global@@3HA (int global)
?global_function@@YAXXZ (void __cdecl global_function(void))
?member_function@A@@QEAAXXZ (public: void __cdecl A::member_function(void))
?static_member@A@@2HA (public: static int A::static_member)
> dumpbin /exports mylib.dll
(some output skipped)
1 0 0001AAC8 ?global@@3HA
2 1 00001000 ?global_function@@YAXXZ
3 2 00001010 ?member_function@A@@QEAAXXZ
4 3 0001AACC ?static_member@A@@2HA
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0V9tu47wRfhr6ZhCBomRZvvCFsonxB83fbZugu9sbgxJHFjcUKYhUDm9fUJSPcbLbFjUMW6Jmvpn55kCKWyu3GnFF5tdkfjPjg2tMv7KOWyPFrDTibVUprreErZUSV0rqJ3jG3kqjSVJAvIziiEaEFoQWj420IK0dEF64BdSVGbTDHgW8NFIhdKZ3Um_hnou3UvYCnIFvUgvzYqPDopC2MtP_YL0l602R-bXRSOY3hOWNc51fJGxN2HpSiCrTErauGq41KkvYOmbpgi7oPI1pPs8WcTpf-tWEZss4T7J4kbAszljMxtVkmc3zZbZgcbpgSexXl96qezH_R6tpkmYsW2R5spwndJ7khC0nPu9qENxxkA5bICzfKlNyBaaHSnFrwTruZAXPvJe8VOjd9QloPc0oCPsC-5T1WA8WrSd8vJcOBq3QWiAZ3WwEVsp2WBGWC6UCAmFLklGP6J_IWqKIYD3oyvmMHPnDtYAW2xJ7qHePvS_CaMIWDhr-jOB8bXS9KRW2ETwgAlfWTHn9dvfXm6_fHja33__29R-Pm-L-fvPw48_rr_cPl4ivWv6Ekem3u2vC1g2qzpcod2gdYeuuN93Gbf3lx-BR41o1sqbhy58edOJ97_qTNi8ga0-XtMChHLaefg41cjf06Dm-g8oMSoA2DmqpBXCwspWK96EXIrizh0RI7VB7irhSb9ByVzU-LQ1CiQ1_lqYHU8M_pR24ggc3CBkyFuErQoM9kmQNdw5eRpslwrZH7iYfRwgUoOQTgtFwL_XwClJbh1xEMPUn_Bysg8roerBSb6egH2TbqTHL0GPXGzGMmfSsj8_bNyXLqJnuMxq-VdcRWljXD5WD8cnimtACAHbVKbWbLjehSEhyDSGRgH1v-kn82chdGW12ZUSY74Yjha9_GU3ckOQ6eIWvDns9GgnVeAF9RA5Pf4W8C-s4ZB_ipaAJS6Su1CAQCGM7ehgLuiceHZYKD5UU54QEgU8c3RHrYz_ITmiXWTtTOQ-t6832f4it5fLcEMDkPJDkBuIQ1n7xPfUB7CIlJwhF0Ig-Ko6PYiwHqURUcnceYiv87WgVKt8-CEKpyBBajHsdXFVwyP2IdSqNr35A2khg7Wuwaswkb4Akt2DKn9Zj-dkEV7ew2QS9jcD6WHcn-A4_gAk1zdbxTsmS0GI_R_b22NrLKVlWrfNCfuXmdk2S4tTLC0bGEjiLel8WH2vgK556EnAOfh558z4rjw2C4uMAalsfXs2lsvAiXePHoMXQt_YsaUcWvUeht5MCBi2wlhoF2Le2NMqvHfWeD-E2fP0eiD3qCgWUb4fw_baSh3JeBhd_21A3lEpW_upo2F1s8f_Cj_e0-USytWc1JD0kGLhSkE5eXaDNm6y4OyvasBs-TMPXf0iynkhLKUlp8kcBN8VjcSpxGlVKiyDM_hiFdvJ7qEOzjmI_iu_f_3UKeN7Ue8i_3xaT9BSDGNqulNrX9xTKSWcQllvTIpjBdYMD-yS7zh-CppzCu8-FeAnLj2pnVP1E71JwHmIczZtN5Q9VF4aff-yxP4b_FSfeyKH0Tsx9uCOcWv08kyfwv6rsHcGfpkgo9Z-kKPY_FCilcVF8yS-k6kScBR3q5Smlv11-AAmwSS2mv1mNB-U0IExefvmc1OOmnIlVIpbJks9wFS9SmubZMl_MmlVWC5FnOS_nOdY0TzlNlwvkyXJZi1gwNpMrRtmcMjaPWZKxeYR1tshKFqec8gTriqQUWy5VpNRz68_Is_EMuopZvqDZTPESlR1f9hjT-BJOqH5jn9_M-pVXuiqHrSUpVdI6e4Bx0ilc7SbjeBoNg9uZcOr1vT-9e4RpbgYHH75ZzIZerU6P9VvpmqGcXqe83envquvNT6z8UX70NrxijeE8r9i_AwAA__-lEHYQ">