https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86490
Bug ID: 86490 Summary: lto1: fatal error: multiple prevailing defs Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: lto Assignee: unassigned at gcc dot gnu.org Reporter: hjl.tools at gmail dot com CC: marxin at gcc dot gnu.org Target Milestone: --- [hjl@gnu-cfl-1 pr23350]$ cat foo.c int foo; void bar() {} [hjl@gnu-cfl-1 pr23350]$ cat bar.c int foo; void bar() {} [hjl@gnu-cfl-1 pr23350]$ cat main.c int foo; int main () { return foo; } [hjl@gnu-cfl-1 pr23350]$ make CC=gcc gcc -O2 -flto -c -o main.o main.c gcc -O2 -flto -c -o foo.o foo.c ar --plugin `gcc -print-prog-name=liblto_plugin.so` -rusc libfoo.a foo.o gcc -O2 -flto -c -o bar.o bar.c ar --plugin `gcc -print-prog-name=liblto_plugin.so` -rusc libbar.a bar.o gcc -o x main.o libfoo.a libbar.a lto1: fatal error: multiple prevailing defs for ‘bar’ compilation terminated. lto-wrapper: fatal error: gcc returned 1 exit status compilation terminated. /usr/local/bin/ld: error: lto-wrapper failed collect2: error: ld returned 1 exit status make: *** [Makefile:14: x] Error 1 [hjl@gnu-cfl-1 pr23350]$ Linker has: if (!blhe) { /* The plugin is called to claim symbols in an archive element from plugin_object_p. But those symbols aren't needed to create output. They are defined and referenced only within IR. */ switch (syms[n].def) { default: abort (); case LDPK_UNDEF: case LDPK_WEAKUNDEF: res = LDPR_UNDEF; break; case LDPK_DEF: case LDPK_WEAKDEF: case LDPK_COMMON: res = LDPR_PREVAILING_DEF_IRONLY; break; } goto report_symbol; } lto1 shouldn't issue lto1: fatal error: multiple prevailing defs for ‘bar’ unless bar will be included in output.