| RUN: lld-link -lldmingw %S/Inputs/gnu-weak.o %S/Inputs/gnu-weak2.o -out:%t.exe |
| |
| GNU ld can handle several definitions of the same weak symbol, and |
| unless there is a strong definition of it, it just picks the first |
| weak definition encountered. |
| |
| For each of the weak definitions, GNU tools produce a regular symbol |
| named .weak.<weaksymbol>.<othersymbol>, where the other symbol name is |
| another symbol defined close by. |
| |
| This can't be reproduced by assembling with llvm-mc, as llvm-mc always |
| produces similar regular symbols named .weak.<weaksymbol>.default. |
| |
| The bundled object files can be produced from test code that looks like |
| this: |
| |
| $ cat gnu-weak.c |
| void weakfunc(void) __attribute__((weak)); |
| void otherfunc(void); |
| |
| __attribute__((weak)) void weakfunc() { |
| } |
| |
| int main(int argc, char* argv[]) { |
| otherfunc(); |
| weakfunc(); |
| return 0; |
| } |
| void mainCRTStartup(void) { |
| main(0, (char**)0); |
| } |
| void __main(void) { |
| } |
| |
| $ cat gnu-weak2.c |
| void weakfunc(void) __attribute__((weak)); |
| |
| __attribute__((weak)) void weakfunc() { |
| } |
| |
| void otherfunc(void) { |
| } |
| |
| $ x86_64-w64-mingw32-gcc -c -O2 gnu-weak.c |
| $ x86_64-w64-mingw32-gcc -c -O2 gnu-weak2.c |
| |
| $ x86_64-w64-mingw32-nm gnu-weak.o | grep weakfunc |
| 0000000000000000 T .weak.weakfunc.main |
| w weakfunc |
| $ x86_64-w64-mingw32-nm gnu-weak2.o | grep weakfunc |
| 0000000000000000 T .weak.weakfunc.otherfunc |
| w weakfunc |