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