Menu

#596 Fix linking of various components with -fno-common

RELEASE_1_0
closed
None
fixed
2020-11-07
2020-11-06
No

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.

1 Attachments

Discussion

  • Joseph Koshy

    Joseph Koshy - 2020-11-07
    • status: new --> accepted
    • assigned_to: Joseph Koshy
     
  • Joseph Koshy

    Joseph Koshy - 2020-11-07

    Patch applied in [r3879], thanks!

     

    Related

    Commit: [r3879]

  • Joseph Koshy

    Joseph Koshy - 2020-11-07
    • status: accepted --> closed
    • Resolution: --> fixed
     

Log in to post a comment.

MongoDB Logo MongoDB