One example, the errors are common: g++ -W -Wall -Werror -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -fmerge-constants -O2 -g -o basic_static_test -Bgcctestdir/ -static basic_test.o gcctestdir/ld: /usr/lib/gcc/i586-suse-linux/4.5/../../../libc.a(errlist.o):(.debug_info+0x1c3): warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead gcctestdir/ld: /usr/lib/gcc/i586-suse-linux/4.5/../../../libc.a(errlist.o):(.debug_info+0x1f1): warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead gcctestdir/ld: /usr/lib/gcc/i586-suse-linux/4.5/../../../libc.a(elf-init.o): in function __libc_csu_irel:elf-init.c:94: error: undefined reference to '__rel_iplt_end' gcctestdir/ld: /usr/lib/gcc/i586-suse-linux/4.5/../../../libc.a(elf-init.o): in function __libc_csu_irel:elf-init.c:94: error: undefined reference to '__rel_iplt_start' gcctestdir/ld: /usr/lib/gcc/i586-suse-linux/4.5/../../../libc.a(elf-init.o): in function __libc_csu_irel:../sysdeps/i386/dl-irel.h:36: error: undefined reference to '__rel_iplt_start' gcctestdir/ld: /usr/lib/gcc/i586-suse-linux/4.5/../../../libc.a(elf-init.o): in function __libc_csu_irel:../sysdeps/i386/dl-irel.h:33: error: undefined reference to '__rel_iplt_start' gcctestdir/ld: /usr/lib/gcc/i586-suse-linux/4.5/../../../libc.a(elf-init.o): in function __libc_csu_irel:../sysdeps/i386/dl-irel.h:36: error: undefined reference to '__rel_iplt_start' collect2: ld returned 1 exit status make[5]: *** [basic_static_test] Error 1 The linker is invoked as ./gcctestdir/ld -m elf_i386 -static -o basic_static_test /usr/lib/gcc/i586-suse-linux/4.5/../../../crt1.o /usr/lib/gcc/i586-suse-linux/4.5/../../../crti.o /usr/lib/gcc/i586-suse-linux/4.5/crtbeginT.o -Lgcctestdir -L/usr/lib/gcc/i586-suse-linux/4.5 -L/usr/lib/gcc/i586-suse-linux/4.5/../../../../i586-suse-linux/lib -L/usr/lib/gcc/i586-suse-linux/4.5/../../.. basic_test.o -lstdc++ -lm --start-group -lgcc -lgcc_eh -lc --end-group /usr/lib/gcc/i586-suse-linux/4.5/crtend.o /usr/lib/gcc/i586-suse-linux/4.5/../../../crtn.o using GNU ld the link works fine. On x86_64-linux this works fine, but on i586-linux it breaks.
Is there a way to easily extract all files used for the link? Most standard libraries are linker scripts and pull in stuff from somewhere.
Which means the fix for PR10893 isn't working?
Passing the -t option to the linker will get you a complete list of all object files and shared libraries that the linker includes in the link. The warning about sys_errlist being deprecated suggests that your system is going to generate a warning on any static link. At least, I don't see anything in basic_static_test which would refer to errlist, so I think the reference must be coming from libgcc or libc itself. Does the GNU linker give a warning when linking with -static? The error about __rel_iplt_start and __rel_iplt_end not being defined is very odd. The 32-bit x86 linker always defines those when linking with -static.
(In reply to comment #3) > Passing the -t option to the linker will get you a complete list of all object > files and shared libraries that the linker includes in the link. > > The warning about sys_errlist being deprecated suggests that your system is > going to generate a warning on any static link. At least, I don't see anything > in basic_static_test which would refer to errlist, so I think the reference > must be coming from libgcc or libc itself. Does the GNU linker give a warning > when linking with -static? No, the GNU linker doesn't give this warning. Maybe gold warns about the symbol definition? > The error about __rel_iplt_start and __rel_iplt_end not being defined is very > odd. The 32-bit x86 linker always defines those when linking with -static. I will produce a tarfile with the objects, anything else you want to know?
# g++ -W -Wall -Werror -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -fmerge-constants -O2 -g -o basic_static_test -Bgcctestdir/ -static basic_test.o -Wl,-t /usr/lib/gcc/i586-suse-linux/4.5/../../../crt1.o /usr/lib/gcc/i586-suse-linux/4.5/../../../crti.o /usr/lib/gcc/i586-suse-linux/4.5/crtbeginT.o basic_test.o /usr/lib/gcc/i586-suse-linux/4.5/libstdc++.a(si_class_type_info.o) /usr/lib/gcc/i586-suse-linux/4.5/libstdc++.a(del_op.o) /usr/lib/gcc/i586-suse-linux/4.5/libstdc++.a(class_type_info.o) /usr/lib/gcc/i586-suse-linux/4.5/libstdc++.a(tinfo.o) /usr/lib/gcc/i586-suse-linux/4.5/../../../libc.a(libc-start.o) /usr/lib/gcc/i586-suse-linux/4.5/../../../libc.a(check_fds.o) ... /usr/lib/gcc/i586-suse-linux/4.5/libgcc_eh.a(unwind-dw2.o) /usr/lib/gcc/i586-suse-linux/4.5/libgcc_eh.a(unwind-dw2-fde-glibc.o) /usr/lib/gcc/i586-suse-linux/4.5/libgcc_eh.a(unwind-c.o) /usr/lib/gcc/i586-suse-linux/4.5/../../../libc.a(dl-iteratephdr.o) /usr/lib/gcc/i586-suse-linux/4.5/crtend.o /usr/lib/gcc/i586-suse-linux/4.5/../../../crtn.o ... files too large to attach. They will appear (at some point) at http://gcc.opensuse.org/gold-bug.tar.xz
CVSROOT: /cvs/src Module name: src Changes by: ian@sourceware.org 2011-07-06 05:12:03 Modified files: gold : ChangeLog i386.cc x86_64.cc Log message: PR gold/12392 * i386.cc (Target_i386::do_finalize_sections): Define __rel_iplt symbols if necessary. * x86_64.cc (Target_x86_64::do_finalize_sections): Likewise. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/ChangeLog.diff?cvsroot=src&r1=1.788&r2=1.789 http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/i386.cc.diff?cvsroot=src&r1=1.134&r2=1.135 http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/x86_64.cc.diff?cvsroot=src&r1=1.132&r2=1.133
I finally got back to this and fixed it. It was a bug which occurred when doing a static link on a system which supports STT_GNU_IFUNC symbols but does not actually use any.