diff options
Diffstat (limited to 'test/COFF/gnu-weak.test')
-rw-r--r-- | test/COFF/gnu-weak.test | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/test/COFF/gnu-weak.test b/test/COFF/gnu-weak.test new file mode 100644 index 000000000000..20284d7f0243 --- /dev/null +++ b/test/COFF/gnu-weak.test @@ -0,0 +1,52 @@ +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 |