<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/57386>57386</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            lld-link fails to export C++ data symbols
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          glevner
      </td>
    </tr>
</table>

<pre>
    Suppose you have the following C++ source file `test.cpp`:

```
int public_data;
int publicFunc()
{
    return 0;
}
```

Microsoft's linker `link.exe` allows you to export both function and data symbols from the command line like so:

```
C:\Users\geoff>clang++ -shared -o test.dll test.cpp -Wl,-export:publicFunc -Wl,-export:public_data
   Creating library test.lib and object test.exp

C:\Users\geoff>llvm-readobj --coff-exports test.dll

File: test.dll
Format: COFF-x86-64
Arch: x86_64
AddressSize: 64bit
Export {
  Ordinal: 1
  Name: publicFunc
  RVA: 0x1000
}
Export {
  Ordinal: 2
  Name: public_data
  RVA: 0x19A60
}
```

If you try to do the same thing with `lld-link`, the linker fails to export the data symbol:

```
C:\Users\geoff>clang++ -fuse-ld=lld -shared -o test.dll test.cpp -Wl,-export:publicFunc -Wl,-export:public_data
lld-link: error: <root>: undefined symbol: public_data
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
```

To get the same results as with `link.exe`, you have to explicitly disable mangling/decoration of the data symbol with `extern "C"`:

```
extern "C" int public_data = 0;
int publicFunc()
{
    return 0;
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1VcGS2jgQ_Rr50mXKlsHAwYcZGKpy2E3VZpMcp2SrbZQRFiXJBPbrt2UDZshk9rAJ5bIltfT8-vVzUxp5Kj51-71xCCfTwVYcEPwWoTZam--qbWDF-CNd4ExnKwoojcDyxKPzk2q_pyHLHliyZsnlTivD1U9V62HflVpVz1J4wbLH-_VN11aMLxhfngHm5y1AP4u-sy0k13Nsvn7zPcP9D1VZ40ztGZ870Kp9QRvohtEEj0hDECE11-frDeBxb6yH0vgt1MTEK9OCaCUEtuBOu9JoB7U1u16Yyux2IUqASLcXJGHeF2AVwrPVZ4fW0bNBU9cse6q0aJuztrHbCosSYgO9rlJruAgM8VfN-CoeeBLWKNpPQoPOFwVXFoUPhdSqtMKeBmCa9Ema8htWflgjmNs0fsJb68MuJkxJRyGOK1o9E3BX8rcwGzIMId3FNsbuRKAMq4-bTXxc5HE-HUIPttqGAK09X9ektOjcJ_VPj5VPS-WHyNNQvhvPfLRStUKHfell7U-x6w_eGO4c-evLQwgkxzRJkjuHvYvN38Z-Jf4IvnzI79Hf9O-HevBlqJMBaXrPOXoDDUIRvyuyafCzlnHwdDjOV_2us9lrocivo7FD6MbK_9-rdecw1pJlayLx-6x7zZAERGuNDQOWrawxtP8pzLpWYk3foRxz-7EKN9xfQZ3lunzPQTYC6vXFo_IUkAgpUGOifCE-BEkdIqj2YCoRusTYsN6q5N8GGvRj_ci_naZvRLixiGNTCkUcG3BfPEpDeX0CqZwoqekSzYZOUC4biZWxPQcw9X2Fr_B49Eitk3FOPZz_Z6N-vR3u-jZJv77pwr-ue0dYpHmezvh0nmaRLDK5zJYi8pQ7FhcT_ODqy7_SbZOOOquLrfd7FxLlG7oakqIrJ1RkmoTOdX7Ee2tC46Opcq5DR4PZPFvk0bYQ80UulllVzbEu8_kyLWcyn2Fd5wKXgleRFiVqV7DZI5utI1XwhPNkwfN0mi2ybJLkOU-TMpGzepllac2mCe6I_iS8eGJsE9mi51B2jaOgVs67MSicU02LeMEXnd8aWzQaDy3aqKdb9Fz_BeucWXA">