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

    <tr>
        <th>Summary</th>
        <td>
            LTO with GCC-compiled non-LTO object can misplace C++ weak symbols
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    ```sh
#!/bin/sh

rm a.cpp lto.o normal-gcc.o normal-clang.o a.out

echo '
__attribute__((noinline))
static int unoptimized_function() { return 42; }

template<int x>
class a
{
public:
   static int b;
};

template<int x>
int a<x>::b = unoptimized_function();

class c
{
public:
   static int d()
   {
      return a<0>::b;
   }
};

#ifdef WITH_MAIN
int main() {}
#endif
' > a.cpp


clang++ -fvisibility=hidden -flto -O3 -c a.cpp -o lto.o
g++ -fvisibility=hidden -O3 -c a.cpp -o normal-gcc.o -DWITH_MAIN
clang++ -fvisibility=hidden -O3 -c a.cpp -o normal-clang.o -DWITH_MAIN

clang++ -flto normal-clang.o lto.o && echo pass1
clang++ -flto lto.o normal-clang.o && echo pass2
clang++ -flto normal-gcc.o lto.o && echo pass3
clang++ -flto lto.o normal-gcc.o && echo pass4
```

Expected output: pass1 pass2 pass3 pass4 (and possibly some 'rm: cannot remove whatever: No such file or directory)

Actual output:

```
pass1
pass2
pass3
/usr/bin/ld: /tmp/lto-llvm-26cd4a.o: in function `__cxx_global_var_init':
ld-temp.o:(.text.startup+0xc): undefined reference to `a<0>::b'
/usr/bin/ld: normal-gcc.o: in function `_GLOBAL__sub_I_main':
a.cpp:(.text.startup+0x37): undefined reference to `a<0>::b'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

I'm not entirely sure if this is an ODR violation or not, but that error isn't particularly helpful. Especially considering that it works if both object files are Clang, and that it works if the object files are swapped.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVt2OozgTfRrnpkRETALhIhf56czX0nzT0mqkvUTGFME7xkZ2kU726VeGpJPO9PzstiIaY86pU-VTJYT36mAQV2yxYYvdRPTUWLdaaymcnZS2Oq9YGo8_37B4x-I14wnjM8b3pTKM798eD1fXgpjKrgNNdmrBWNcKHR2kvC2kFuYwtSCmtqd7LMrGAuPZuCoKQeRU2RMWBeNLxpfGKqOVQcbz8Bte8yRISVCGoDe2I9Wqv7Eq6t5IUtYMwBxYtgGH1DsDc86SDbBsdx-asO20IGTJNjCdWPI0bkgtvAdxeTfbjDddX2olWXJBA8CdjJIlm-v7u9v9z-OElWDJdniSrFmyLoElu5_k9MA8CpX_Rmh1IbpuvaFg-LvUK6iKb6rewg6A3Y8SZTxRdYU1_Pn89X_F_9fPX255tkLdncuNhCdoKlVfVxmw5Gl00zvma7rmwPiG8Q1E9VF5VSqt6MySXaOqCg1EtSYL0UsCkbx4MrKjLUeKX8AfgO-cHO0e0voNOR_zXZvhO8aPeENCD7ixzRhPGU9haKBOeD_7EfpdV145HtH8F7HHGnwcOfmtyCPDI3Z-yfw6cO4L8XTqUBJWYHvqemLJekx0FDyGHkmA8aUwFXTWe1XqM3jbYhgrrg0oKYyxBA5be0R4bQThEV3Y-WLB97KBWmkE66BSDiVZd37rkfG6ltQLfRPyzpzvtd-dxV1h7-rE-L737m2W6ioIYXxPbReWZCOtj23EU1nNxdSGXWXgOgiApXFRyNOpOGhbCl0chSuUURSG6FWYrqIwdQYw48sp4YmmnoSjvmN8E5_kMEzW0JsKa2WwAoc1OjQSgWyI8TgCriP6Q_X3R_yR3k-fXzbrz0Xh-7J4LsZZcFM7tvsPlCbZf5Y6GjJZAzpnh-PWynxDB9K2bbBLLZTGCl4VNYAnRSBthTALbuo9QnQMATwiKHO0UoxzOP-JY58Zz1oIXkNDymFwYu8QVA3UKA_KgzDwsvsDjsrqgTC4zlhifAtlT0CNoFEvKB-qRNAJR0r2Wjh9hgZ1V_d6Ck--Q6mE1meQ1nhVoVPmMOIVwat133yIW1pqwJZ_oaTB5R6EQ9iOvbqFUIbvMNTg9xD_KroOq-mkWiVVnuRigqtZmvN0lmb5fNKs0kW8iOs4E5jPl-VCVFmOi3yepdkiyfJYTtSKxzyJl3w2m83yeT5NeT6r6mwxz-Z5iWXK5jG2QulpaICpdYeJ8r7HVTpfLrKJFiVqP3y1cG7wFYZNxnn4iHGroWnK_uDZPNbKk7-xkCKNq89fX8aj_rTdRtK23XD4xpoo7FzylcJAq3ynhUTYXqbZK4pv4M9tabWf9E6vGqLOD47dM74_KGr6ciptGxpCH6__os7ZQMr4fpDqGd8PqfwTAAD__w4Z4EE">