As of gcc 10 and clang 11, -fno-common is now the default, which makes linking fail if there are any duplicate symbols. E.g. on FreeBSD 13-CURRENT, with r3878:
cc -O2 -pipe -I. -I/share/dim/src/elftoolchain/sf/ld -I. -I/share/dim/src/elftoolchain/sf/ld -I/share/dim/src/elftoolchain/sf/ld/../common -I/share/dim/src/elftoolchain/sf/ld/../libdwarf -I/share/dim/src/elftoolchain/sf/ld/../libelf -I/share/dim/src/elftoolchain/sf/ld/../libelftc -g -std=gnu99 -Wno-format-zero-length -nobuiltininc -idirafter /usr/lib/clang/11.0.0/include -fstack-protector-strong -Wsystem-headers -Werror -Wall -Wno-format-y2k -W -Wno-unused-parameter -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wshadow -Wunused-parameter -Wcast-align -Wno-pointer-sign -Wno-empty-body -Wno-string-plus-int -Wno-unused-const-variable -Qunused-arguments -L/share/dim/src/elftoolchain/sf/ld/../libdwarf -L/share/dim/src/elftoolchain/sf/ld/../libelf -L/share/dim/src/elftoolchain/sf/ld/../libelftc -static -o ld.full amd64.o amd64_script.o i386.o i386_script.o ld_arch.o ld_dynamic.o ld_ehframe.o ld_error.o ld_exp.o ld_file.o ld_hash.o ld_input.o ld_layout.o ld_main.o ld_options.o ld_output.o ld_path.o ld_reloc.o ld_script.o ld_strtab.o ld_symbols.o ld_symver.o mips.o littlemips_script.o bigmips_script.o ld_script_lexer.o ld_script_parser.o -lelftc -ldwarf -lelf
ld: error: duplicate symbol: amd64_script
>>> defined at amd64.h:29 (./amd64.h:29)
>>> amd64.o:(amd64_script)
>>> defined at amd64_script.c:1
>>> amd64_script.o:(.data+0x0)
ld: error: duplicate symbol: i386_script
>>> defined at i386.h:29 (./i386.h:29)
>>> i386.o:(i386_script)
>>> defined at i386_script.c:1
>>> i386_script.o:(.data+0x0)
ld: error: duplicate symbol: amd64_script
>>> defined at amd64.h:29 (./amd64.h:29)
>>> amd64.o:(amd64_script)
>>> defined at amd64.h:29 (./amd64.h:29)
>>> ld_arch.o:(.bss+0x8)
ld: error: duplicate symbol: i386_script
>>> defined at i386.h:29 (./i386.h:29)
>>> i386.o:(i386_script)
>>> defined at i386.h:29 (./i386.h:29)
>>> ld_arch.o:(.bss+0x0)
ld: error: duplicate symbol: bigmips_script
>>> defined at mips.h:27 (./mips.h:27)
>>> ld_arch.o:(bigmips_script)
>>> defined at mips.h:27 (./mips.h:27)
>>> mips.o:(.bss+0x8)
ld: error: duplicate symbol: littlemips_script
>>> defined at mips.h:26 (./mips.h:26)
>>> ld_arch.o:(littlemips_script)
>>> defined at mips.h:26 (./mips.h:26)
>>> mips.o:(.bss+0x0)
ld: error: duplicate symbol: littlemips_script
>>> defined at mips.h:26 (./mips.h:26)
>>> ld_arch.o:(littlemips_script)
>>> defined at littlemips_script.c:1
>>> littlemips_script.o:(.data+0x0)
ld: error: duplicate symbol: bigmips_script
>>> defined at mips.h:27 (./mips.h:27)
>>> ld_arch.o:(bigmips_script)
>>> defined at bigmips_script.c:1
>>> bigmips_script.o:(.data+0x0)
cc: error: linker command failed with exit code 1 (use -v to see invocation)
*** Error code 1
I propose the attached patch to fix this. It makes the declarations of amd64_script, i386_script, littlemips_script and bigmips_script extern. The definitions are already in the right places.
Patch applied in [r3879], thanks!
Related
Commit: [r3879]