Bug 22656 - Gold linker oftens fails with Solaris 10 system libraries
Summary: Gold linker oftens fails with Solaris 10 system libraries
Status: UNCONFIRMED
Alias: None
Product: binutils
Classification: Unclassified
Component: gold (show other bugs)
Version: 2.29
: P2 normal
Target Milestone: ---
Assignee: Jessica Clarke
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2017-12-31 17:20 UTC by John Marino
Modified: 2018-01-12 17:39 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments
Attempt to link python36 with gold linker on Solaris 10u8 and gcc 7.2 (10.17 KB, text/plain)
2017-12-31 17:20 UTC, John Marino
Details
build log when ld.bfd is used instead (10.19 KB, text/plain)
2018-01-01 15:15 UTC, John Marino
Details

Note You need to log in before you can comment on or make changes to this bug.
Description John Marino 2017-12-31 17:20:47 UTC
Created attachment 10706 [details]
Attempt to link python36 with gold linker on Solaris 10u8 and gcc 7.2

Looking through old bug reports, the message "duplicate definition for version 0" error has been showing for years, but was thought fixed.  Unfortunately for me, it's not fixed. (e.g. https://sourceware.org/bugzilla/show_bug.cgi?id=11748)

Attached is a build log.  It's randomly selected; I've seen similar errors in several places.  Looking throught the gold linker code, it seems the version referenced is from the SHT_GNU_verdef elf section, which doesn't exist in Solaris 10 (I'm intentionally restricted to 2009's update 8 version) libraries.

So at first glance, this seems like a legitimate gold linker (2.29.1) bug where it's making the assumption that SHT_GNU_verdef is the only section for symbol versioning (I guess).  I suspect this error only appears upon the attempt to link the same system library more than once.

I suppose I could try reproducing a small test case as well.  I figured mentioning that solaris libraries don't have these GNU sections might be enough to trace a logic error immediately.

Regards,
John

--  error messages fro build log --
/raven/toolchain/bin/ld.gold: error: /lib/amd64/libsocket.so: duplicate definition for version 0
/raven/toolchain/bin/ld.gold: error: /lib/amd64/libsocket.so: duplicate definition for version 0
/raven/toolchain/bin/ld.gold: error: /lib/amd64/libsocket.so: duplicate definition for version 0
/raven/toolchain/bin/ld.gold: error: /lib/amd64/libnsl.so: duplicate definition for version 0
/raven/toolchain/bin/ld.gold: error: /lib/amd64/libnsl.so: duplicate definition for version 0
/raven/toolchain/bin/ld.gold: error: /lib/amd64/libnsl.so: duplicate definition for version 0
/raven/toolchain/bin/ld.gold: error: /lib/amd64/libnsl.so: duplicate definition for version 0
/raven/toolchain/bin/ld.gold: error: /lib/amd64/librt.so: duplicate definition for version 0
/raven/toolchain/bin/ld.gold: error: /lib/amd64/librt.so: duplicate definition for version 0
/raven/toolchain/bin/ld.gold: error: /lib/amd64/libm.so: duplicate definition for version 0
collect2: error: ld returned 1 exit status
Comment 1 John Marino 2018-01-01 15:15:03 UTC
Created attachment 10707 [details]
build log when ld.bfd is used instead

So far I haven't been able to create a small test case.

By the way, the ld.bfd linker isn't working either, but it fails differently.
---
/raven/toolchain/bin/ld.bfd: ./libpython3.6m.so: fsync: invalid version 5 (max 0)
./libpython3.6m.so: error adding symbols: Bad value
---

log for ld.bfd attached.
Comment 2 John Marino 2018-01-01 23:01:17 UTC
I had a small mistake recreating a test case.  After I fixed the error, it's easy to reproduce this.

Makefile:
CC=/raven/share/raven/toolchain/gcc7/bin/cc

all: test

test:
        ${CC} --verbose -fuse-ld=gold \
                test.c  -o ${.TARGET} \
                -Wl,-rpath,/lib/amd64 -lsocket

clean:
        rm test


test.c file:
#include <stdio.h>
#include <sys/socket.h>

int main (int argc, char *argv[])
{
   int socket_desc;
   socket_desc = socket(AF_INET, SOCK_STREAM, 0);

   if (socket_desc == -1)
   {
      printf ("could not create socket");
   }
   else
   {
      printf ("success: %d\n", socket_desc);
   }
   return 0;
}


output:
/raven/share/raven/toolchain/gcc7/bin/cc --verbose -fuse-ld=gold  test.c  -o test  -Wl,-rpath,/lib/amd64 -lsocket
Using built-in specs.
COLLECT_GCC=/raven/share/raven/toolchain/gcc7/bin/cc
COLLECT_LTO_WRAPPER=/raven/share/raven/toolchain/gcc7/bin/../libexec/gcc/x86_64-raven-solaris2.10/7.2.0/lto-wrapper
Target: x86_64-raven-solaris2.10
Configured with: /construction/gcc7/gcc-7.2.0/configure --enable-languages=c,c++,ada,fortran --with-local-prefix=/raven --with-system-zlib --with-gmp=/raven --with-mpc=/raven --with-mpfr=/raven --with-libiconv-prefix=/raven --enable-shared --enable-threads=posix --enable-checking=release --enable-libquadmath --disable-nls --disable-multilib --disable-libsanitizer --disable-libvtv --disable-libmpx --disable-libcilkrts --with-ld=/raven/toolchain/bin/ld --with-as=/raven/toolchain/bin/as --with-pkgversion=Ravenports --disable-bootstrap --prefix=/raven/toolchain/gcc7 --localstatedir=/var --mandir=/raven/toolchain/gcc7/share/man --infodir=/raven/toolchain/gcc7/share/info/. --build=x86_64-raven-solaris2.10
Thread model: posix
gcc version 7.2.0 (Ravenports)
COLLECT_GCC_OPTIONS='-v' '-fuse-ld=gold' '-o' 'test' '-mtune=generic' '-march=x86-64'
 /raven/share/raven/toolchain/gcc7/bin/../libexec/gcc/x86_64-raven-solaris2.10/7.2.0/cc1 -quiet -v -iprefix /raven/share/raven/toolchain/gcc7/bin/../lib/gcc/x86_64-raven-solaris2.10/7.2.0/ test.c -quiet -dumpbase test.c -mtune=generic -march=x86-64 -auxbase test -version -fuse-ld=gold -o /var/tmp//ccTW9Wdd.s
GNU C11 (Ravenports) version 7.2.0 (x86_64-raven-solaris2.10)
        compiled by GNU C version 7.2.0, GMP version 6.1.2, MPFR version 3.1.6, MPC version 1.0.3, isl version none
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/raven/share/raven/toolchain/gcc7/bin/../lib/gcc/x86_64-raven-solaris2.10/7.2.0/../../../../x86_64-raven-solaris2.10/include"
ignoring duplicate directory "/raven/share/raven/toolchain/gcc7/bin/../lib/gcc/../../lib/gcc/x86_64-raven-solaris2.10/7.2.0/include"
ignoring duplicate directory "/raven/share/raven/toolchain/gcc7/bin/../lib/gcc/../../lib/gcc/x86_64-raven-solaris2.10/7.2.0/include-fixed"
ignoring nonexistent directory "/raven/share/raven/toolchain/gcc7/bin/../lib/gcc/../../lib/gcc/x86_64-raven-solaris2.10/7.2.0/../../../../x86_64-raven-solaris2.10/include"
#include "..." search starts here:
#include <...> search starts here:
 /raven/share/raven/toolchain/gcc7/bin/../lib/gcc/x86_64-raven-solaris2.10/7.2.0/include
 /raven/share/raven/toolchain/gcc7/bin/../lib/gcc/x86_64-raven-solaris2.10/7.2.0/include-fixed
 /raven/include
 /raven/share/raven/toolchain/gcc7/bin/../lib/gcc/../../include
 /usr/include
End of search list.
GNU C11 (Ravenports) version 7.2.0 (x86_64-raven-solaris2.10)
        compiled by GNU C version 7.2.0, GMP version 6.1.2, MPFR version 3.1.6, MPC version 1.0.3, isl version none
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: cd4d8ac904084da056c72dd4a85e0eb9
COLLECT_GCC_OPTIONS='-v' '-fuse-ld=gold' '-o' 'test' '-mtune=generic' '-march=x86-64'
 /raven/toolchain/bin/as -v -V -Qy -s --64 -o /var/tmp//ccabLqLm.o /var/tmp//ccTW9Wdd.s
GNU assembler version 2.29.1 (x86_64-raven-solaris2.10) using BFD version (GNU Binutils) 2.29.1
COMPILER_PATH=/raven/share/raven/toolchain/gcc7/bin/../libexec/gcc/x86_64-raven-solaris2.10/7.2.0/:/raven/share/raven/toolchain/gcc7/bin/../libexec/gcc/:/usr/ccs/bin/
LIBRARY_PATH=/raven/share/raven/toolchain/gcc7/bin/../lib/gcc/x86_64-raven-solaris2.10/7.2.0/:/raven/share/raven/toolchain/gcc7/bin/../lib/gcc/:/raven/share/raven/toolchain/gcc7/bin/../lib/gcc/x86_64-raven-solaris2.10/7.2.0/../../../amd64/:/lib/amd64/:/usr/lib/amd64/:/raven/share/raven/toolchain/gcc7/bin/../lib/gcc/x86_64-raven-solaris2.10/7.2.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-fuse-ld=gold' '-o' 'test' '-mtune=generic' '-march=x86-64'
 /raven/share/raven/toolchain/gcc7/bin/../libexec/gcc/x86_64-raven-solaris2.10/7.2.0/collect2 -plugin /raven/share/raven/toolchain/gcc7/bin/../libexec/gcc/x86_64-raven-solaris2.10/7.2.0/liblto_plugin.so -plugin-opt=/raven/share/raven/toolchain/gcc7/bin/../libexec/gcc/x86_64-raven-solaris2.10/7.2.0/lto-wrapper -plugin-opt=-fresolution=/var/tmp//ccdyYPQw.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -V --enable-new-dtags -rpath /raven/toolchain/gcc7/lib/amd64 -m elf_x86_64 -Y P,/lib/amd64:/usr/lib/amd64 -Qy -fuse-ld=gold -o test /usr/lib/amd64/crt1.o /usr/lib/amd64/crti.o /usr/lib/amd64/values-Xa.o /raven/share/raven/toolchain/gcc7/bin/../lib/gcc/x86_64-raven-solaris2.10/7.2.0/crtbegin.o -L/raven/share/raven/toolchain/gcc7/bin/../lib/gcc/x86_64-raven-solaris2.10/7.2.0 -L/raven/share/raven/toolchain/gcc7/bin/../lib/gcc -L/raven/share/raven/toolchain/gcc7/bin/../lib/gcc/x86_64-raven-solaris2.10/7.2.0/../../../amd64 -L/lib/amd64 -L/usr/lib/amd64 -L/raven/share/raven/toolchain/gcc7/bin/../lib/gcc/x86_64-raven-solaris2.10/7.2.0/../../.. /var/tmp//ccabLqLm.o -rpath /lib/amd64 -lsocket -lgcc -lgcc_eh -lc -lgcc -lgcc_eh /raven/share/raven/toolchain/gcc7/bin/../lib/gcc/x86_64-raven-solaris2.10/7.2.0/crtend.o /usr/lib/amd64/crtn.o
GNU gold (GNU Binutils 2.29.1) 1.14
  Supported targets:
   elf64-s390
   elf32-s390
   elf64-littleaarch64
   elf64-bigaarch64
   elf32-littleaarch64
   elf32-bigaarch64
   elf64-tradlittlemips
   elf32-tradlittlemips-nacl
   elf64-tradbigmips
   elf32-tradlittlemips-nacl
   elf32-tradlittlemips
   elf32-tradlittlemips-nacl
   elf32-tradbigmips
   elf32-tradlittlemips-nacl
   elf32-tilegx-be
   elf64-tilegx-be
   elf32-tilegx-le
   elf64-tilegx-le
   elf32-bigarm
   elf32-bigarm-nacl
   elf32-littlearm
   elf32-littlearm-nacl
   elf64-powerpcle
   elf64-powerpc
   elf32-powerpcle
   elf32-powerpc
   elf64-sparc
   elf32-sparc
   elf32-x86-64
   elf32-x86-64-freebsd
   elf32-x86-64-nacl
   elf64-x86-64
   elf64-x86-64-freebsd
   elf64-x86-64-nacl
   elf32-iamcu
   elf32-i386
   elf32-i386-freebsd
   elf32-i386-nacl
  Supported emulations:
   elf64_s390
   elf32_s390
   aarch64_elf64_le_vec
   aarch64_elf64_be_vec
   aarch64_elf32_le_vec
   aarch64_elf32_be_vec
   elf64ltsmip
   elf32-tradlittlemips-nacl
   elf64btsmip
   elf32-tradlittlemips-nacl
   elf32ltsmip
   elf32-tradlittlemips-nacl
   elf32btsmip
   elf32-tradlittlemips-nacl
   elf32tilegx_be
   elf64tilegx_be
   elf32tilegx
   elf64tilegx
   armelfb
   armelfb_nacl
   armelf
   armelf_nacl
   elf64lppc
   elf64ppc
   elf32lppc
   elf32ppc
   elf64_sparc
   elf32_sparc
   elf32_x86_64
   elf32_x86_64_nacl
   elf_x86_64
   elf_x86_64_nacl
   elf_iamcu
   elf_i386
   elf_i386_nacl
/raven/toolchain/bin/ld.gold: error: /lib/amd64/libsocket.so: duplicate definition for version 0
/raven/toolchain/bin/ld.gold: error: /lib/amd64/libsocket.so: duplicate definition for version 0
/raven/toolchain/bin/ld.gold: error: /lib/amd64/libsocket.so: duplicate definition for version 0
collect2: error: ld returned 1 exit status
*** Error code 1

Stop.
make: stopped in /export/home/workzone/socket-test
Comment 3 Cary Coutant 2018-01-12 17:39:17 UTC
Unfortunately, I think getting gold to work for Solaris binaries would be a major project. There are probably many things in the Solaris ABI that gold doesn't support, the symbol versioning mechanism being just one of them. I'm not familiar enough with Solaris to say for sure, though; I hope James can comment further.