Suppressing warnings about the needs of -fPIC for symbols that are unresolved?
ISHIKAWA,chiaki
ishikawa@yk.rim.or.jp
Wed Jan 27 17:38:00 GMT 2016
As it turns out, I asked the list basically the same question in 2014.
https://sourceware.org/ml/binutils/2014-06/msg00157.html
Spurious misguided message from GNU gold for missing symbol under 64-bit?
So it may be only a problem with 64-bit version, but still it would be
nice to fix this issue.
TIA
CI
On 2016/01/24 23:34, ISHIKAWA,chiaki wrote:
> Firstly, thank you for sharing the great tools, especially GNU gold
> linker.
>
> I have come to realize there is a problem with a slightly misleading
> warning for a LARGE project, though. So I am reporting it.
>
> Background:
>
> Here is a short set of files that shows the symptom of
> missing symbol at link stage.
> Basically, I put a slightly different parameter type in a function
> declaration in a
> header file, a type different from the one I used in the function's
> implementation in a c++ source file. The use of such function
> in a different C++ source file would would lead to the link time error
> for C++.
>
> Test files:
> --- Begin quote Makefile ---
> all: test-main
>
> test-subr.o: test-subr.cpp
> g++-5 -c -gsplit-dwarf test-subr.cpp
> test-main.o: test-main.cpp
> g++-5 -c -gsplit-dwarf test-main.cpp
> test-main: test-main.o test-subr.o
> ld --version
> gcc-5 --version
> g++-5 --verbose -gsplit-dwarf -o test-main test-main.o test-subr.o
> --- end quote
>
> --- Begin quote test-main.cpp which calls FillRead()
> #include <unistd.h>
> #include <stdio.h>
> #include "test-header.h"
>
> char buf[512];
> int
> main() {
> int obtained;
> ssize_t rc;
>
> rc = FillRead(0, buf, 512, &obtained);
> return rc;
> }
> --- End quote test-main.cpp
> --- Begin quote test-subr.cpp which implements FillRead()
> #include "test-header.h"
> #include <unistd.h>
>
> ssize_t
> FillRead(int d, char *cp, int len, int *reallen) {
> ssize_t rc;
>
> rc = read(d, cp, len);
>
> if(rc >= 0)
> *reallen = rc;
> return rc;
> }
> --- end quote test-subr.cpp
> --- begin quote test-header.h which declares FillRead() with an
> incorrect type.
>
> #include <unistd.h>
> /*
> * Note that the second paramter is of type |void *cp| and
> * not |char *| as is declared in test-subr.cpp
> */
> extern ssize_t FillRead(int d, void *cp, int len, int *reallen);
>
> --- end
>
> The warning from linking stage is shown in Warning-1 below. The
> function signatures
> don't match, thus the failure.
> I put the version number of GNU gold and GCC in Makefile which showed the
> symptom I am discussing subsequently.
> In the small test sample, the
> message about "undefined reference" is loud and clear. All is fine.
>
> But in a real world case of LARGE build of mozilla thunderbird mail
> client which produces a library of almost 1GB (well actually 500MB or
> so) without -gsplit-dwarf (I use GNU gold here and use -gsplit-dwarf,
> though),
> GNU gold linker prints MANY spurious "requires dynamic R_X86_64_PC32
> reloc against
> '_Z15FullyReadStreamP14nsIInputStreamPvjPj' which may overflow at
> runtime; recompile with -fPIC" about a symbol as in Warning-2. And the
> symbol
> turned out to be unresolved at the end: function name and the
> parameters are slightly changed.)
>
> ========================================
> Warning-1:
> ----------------------------------------
>
> -*- mode: compilation; default-directory: "/tmp/" -*-
> Compilation started at Sun Jan 24 23:14:36
>
> make -k
> ld --version
> GNU gold (GNU Binutils 2.26.51.20160102) 1.11
> Copyright (C) 2016 Free Software Foundation, Inc.
> This program is free software; you may redistribute it under the terms of
> the GNU General Public License version 3 or (at your option) a later
> version.
> This program has absolutely no warranty.
> gcc-5 --version
> gcc-5 (Debian 5.3.1-4) 5.3.1 20151219
> Copyright (C) 2015 Free Software Foundation, Inc.
> This is free software; see the source for copying conditions. There is NO
> warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
> PURPOSE.
>
> g++-5 --verbose -gsplit-dwarf -o test-main test-main.o test-subr.o
> Using built-in specs.
> COLLECT_GCC=g++-5
> COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
> Target: x86_64-linux-gnu
> Configured with: ../src/configure -v --with-pkgversion='Debian
> 5.3.1-4' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs
> --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++
> --prefix=/usr --program-suffix=-5 --enable-shared
> --enable-linker-build-id --libexecdir=/usr/lib
> --without-included-gettext --enable-threads=posix --libdir=/usr/lib
> --enable-nls --with-sysroot=/ --enable-clocale=gnu
> --enable-libstdcxx-debug --enable-libstdcxx-time=yes
> --with-default-libstdcxx-abi=new --enable-gnu-unique-object
> --disable-vtable-verify --enable-libmpx --enable-plugin
> --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk
> --enable-gtk-cairo
> --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre
> --enable-java-home
> --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64
> --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64
> --with-arch-directory=amd64
> --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc
> --enable-multiarch --with-arch-32=i586 --with-abi=m64
> --with-multilib-list=m32,m64,mx32 --enable-multilib
> --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu
> --host=x86_64-linux-gnu --target=x86_64-linux-gnu
> Thread model: posix
> gcc version 5.3.1 20151219 (Debian 5.3.1-4)
> COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/
>
> LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/
>
> COLLECT_GCC_OPTIONS='-v' '-gsplit-dwarf' '-o' 'test-main'
> '-shared-libgcc' '-mtune=generic' '-march=x86-64'
> /usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin
> /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so
> -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
> -plugin-opt=-fresolution=/tmp/ccMsY9GA.res
> -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc
> -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s
> -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr
> -m elf_x86_64 --hash-style=gnu -dynamic-linker
> /lib64/ld-linux-x86-64.so.2 -o test-main
> /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o
> /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o
> /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o
> -L/usr/lib/gcc/x86_64-linux-gnu/5
> -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu
> -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib
> -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu
> -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../..
> test-main.o test-subr.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
> /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o
> /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o
> test-main.cpp:11: error: undefined reference to 'FillRead(int, void*,
> int, int*)'
> collect2: error: ld returned 1 exit status
> Makefile:8: recipe for target 'test-main' failed
> make: *** [test-main] Error 1
> make: Target 'all' not remade because of errors.
>
> Compilation exited abnormally with code 2 at Sun Jan 24 23:14:36
>
> ========================================
> Warning-2: real-world case: Mozilla Thunderbid development (function
> names and types are slightly different)
> ----------------------------------------
>
> ... finally linking stage of a library called libxul.o ...
>
> Executing: /usr/bin/ccache /usr/bin/g++-5 -fno-builtin-strlen
> -Wl,--gdb-index -Dfdatasync=fdatasync -DDEBUG_4GB_CHECK
> -DUSEHELGRIND=1 -Wall -Wempty-body -Wignored-qualifiers
> -Woverloaded-virtual -Wpointer-arith -Wtype-limits -Wunreachable-code
> -Wcast-align -Wno-invalid-offsetof -fno-exceptions
> -fno-strict-aliasing -fno-rtti -fno-exceptions -fno-math-errno
> -std=gnu++0x -pthread -pipe -gsplit-dwarf -g -Og
> -fno-omit-frame-pointer -freorder-blocks -fno-omit-frame-pointer -fPIC
> -shared -Wl,-z,defs -Wl,-h,libxul.so -o libxul.so
> /NREF-COMM-CENTRAL/objdir-tb3/toolkit/library/tmp8DVHzF.list -lpthread
> -Wl,-z,noexecstack -Wl,-z,text -Wl,--build-id
> -Wl,-version-script,symverscript
> -Wl,-rpath-link,/NREF-COMM-CENTRAL/objdir-tb3/dist/bin
> -Wl,-rpath-link,/usr/local/lib ../../js/src/libjs_static.a
> ../../js/src/libjs_static.a ../../intl/icu/target/lib/libicui18n.a
> ../../intl/icu/target/lib/libicuuc.a
> ../../intl/icu/target/lib/libicudata.a
> ../../security/nss/lib/crmf/libcrmf.a ../../js/src/libjs_static.a
> ../../ldap/c-sdk/libraries/libldap/libldap60.so
> ../../ldap/c-sdk/libraries/libldif/libldif60.so
> ../../ldap/c-sdk/libraries/libprldap/libprldap60.so
> ../../nsprpub/lib/ds/libplds4.so ../../nsprpub/lib/libc/src/libplc4.so
> ../../nsprpub/pr/src/libnspr4.so ../../security/nss/lib/nss/libnss3.so
> ../../security/nss/lib/smime/libsmime3.so
> ../../security/nss/lib/ssl/libssl3.so
> ../../security/nss/lib/util/libnssutil3.so
> ../../config/external/sqlite/libmozsqlite3.so
> ../../config/external/lgpllibs/liblgpllibs.so
> ../../widget/gtk/mozgtk/stub/libmozgtk_stub.so -ldl -lm -ldl
> -lfreetype -lfontconfig -lrt -lXrender -lXext -lXdamage -lXfixes
> -lXcomposite -lasound -ldbus-glib-1 -ldbus-1 -lgobject-2.0 -lglib-2.0
> -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo
> -lgdk_pixbuf-2.0 -lgio-2.0 -lX11 -lpangoft2-1.0 -lXt -lgthread-2.0
> /NREF-COMM-CENTRAL/objdir-tb3/toolkit/library/tmp8DVHzF.list:
> INPUT("StaticXULComponentsStart.o")
> INPUT("../../memory/volatile/Unified_cpp_memory_volatile0.o")
> INPUT("../../media/kiss_fft/kiss_fft.o")
> INPUT("../../media/kiss_fft/kiss_fftr.o")
> INPUT("../../media/libstagefright/fake_log_device.o")
> ....
> many lines (# of objects, I think)
> ...
> INPUT("../../modules/zlib/src/trees.o")
> INPUT("../../modules/zlib/src/uncompr.o")
> INPUT("../../modules/zlib/src/zutil.o")
> INPUT("StaticXULComponentsEnd/StaticXULComponentsEnd.o")
>
> /usr/local/bin/ld: error:
> /NREF-COMM-CENTRAL/objdir-tb3/toolkit/library/../../mailnews/base/src/nsMessenger.o:
> requires dynamic R_X86_64_PC32 reloc against
> '_Z15FullyReadStreamP14nsIInputStreamPvjPj' which may overflow at
> runtime; recompile with -fPIC
> /usr/local/bin/ld: error:
> /NREF-COMM-CENTRAL/objdir-tb3/toolkit/library/../../mailnews/base/src/nsMsgFolderCompactor.o:
> requires dynamic R_X86_64_PC32 reloc against
> '_Z15FullyReadStreamP14nsIInputStreamPvjPj' which may overflow at
> runtime; recompile with -fPIC
> /usr/local/bin/ld: error:
> /NREF-COMM-CENTRAL/objdir-tb3/toolkit/library/../../mailnews/base/util/nsMsgDBFolder.o:
> requires dynamic R_X86_64_PC32 reloc against
> '_Z15FullyReadStreamP14nsIInputStreamPvjPj' which may overflow at
> runtime; recompile with -fPIC
>
> ... many lines of misleading warnings about -fPIC
> to overwhelm
> the developer ...
>
> amP14nsIInputStreamPvjPj' which may overflow at runtime; recompile
> with -fPIC
> /usr/local/bin/ld: error:
> /NREF-COMM-CENTRAL/objdir-tb3/toolkit/library/../../mailnews/import/src/nsImportScanFile.o:
> requires dynamic R_X86_64_PC32 reloc against
> '_Z15FullyReadStreamP14nsIInputStreamPvjPj' which may overflow at
> runtime; recompile with -fPIC
> /usr/local/bin/ld: error: read-only segment has dynamic relocations
> /NREF-COMM-CENTRAL/comm-central/mailnews/base/src/nsMessenger.cpp:1997: error:
> undefined rgeference to 'FullyReadStream(nsIInputStream*, void*,
> unsigned int, unsigned int*)'
> /NREF-COMM-CENTRAL/objdir-tb3/toolkit/library/../../mailnews/base/src/nsMessenger.o(.debug_addr+0xdcb8):
> error: undefined reference to 'FullyReadStream(nsIInputStream*, void*,
> unsigned int, unsigned int*)'
> /NREF-COMM-CENTRAL/comm-central/mailnews/base/src/nsMsgFolderCompactor.cpp:828:
> error: undefined reference to 'FullyReadStream(nsIInputStream*, void*,
> unsigned int, unsigned int*)'
>
> In the case of Mozilla Thunderbird, I defined function
> FullyReadStream(nsIInputStream*, char*, unsigned int unsigned int*),
> i.e., with a parameter of |char *| insated of |void *| at the second
> position in the parameter list. Thus the signatures did not match and
> so we had an unresolved symbol error.
>
> Summary and Request:
>
> Finally at the end of -fPIC warnings which overwhelmed a typical
> developer initially, we get the undefined reference error. So actually
> -fPIC was not necessary after all (I recompiled the source which took
> me a couple of hours or so, and only then realized there is something
> wrong.) However the unresolved error was buried in the
> preceding warnings about -fPIC and I was misled initially.
>
> My question:
>
> Can we possibly suppress the warning line of "-fPIC" if the related
> symbol turns out to be undefined in the end?
> (This may involve deferring the print out of -fPIC until all the
> symbols are resolved:
> Oh, come to think of it, if we do explicit dynamic loading or
> something, this will be impossible. We will not know, for sure, if the
> symbol in question is finally resolved or not until run-time. But
> mozilla TB and many programs do not do that intentionally.)
>
> TIA
>
>
>
>
More information about the Binutils
mailing list