Re: GNU ld: Uninitialized variables with "-Wl, --exclude-libs, ALL" global
Johan Bolmsjö <[email protected]> Mon, 31 Aug 2015 10:14:34 +0200
| Newsgroups | gmane.comp.gnu.utils.bugs |
|---|---|
| Message-ID | <CA+Th4KbGp4=6KDLr04qYpMZDfTxa8Kav2bE9zF+YG8j-jXfN6A@mail.gmail.com> |
Sorry, it seems I found the wrong mailing list for reporting GNU ld bugs (obsolete information obtained using google). I will send the mail to the binutils bug mailing list. On Mon, Aug 31, 2015 at 10:04 AM, Johan Bolmsjö <[email protected]> wrote: > Hello, > > I'm building a shared library using a bunch of static libraries. The > shared library is linked using the option "-Wl,--exclude-libs,ALL". > According to the documentation this option should prevent all symbols in > the static libraries from being exported. I have found this to be true for > functions and initialized variables. Uninitialized variables however, e.g. > a global variable "int foo;" are still global in the resulting shared > library. The gold linker behaves according to the documentation and > uninitialized variables are local in the resulting shared library. I.e. > there is a difference in behaviour between GNU ld and GNU gold linker. > *--exclude-libs* *lib**,**lib**,...* Specifies a list of archive > libraries from which symbols should not be automatically exported.gcc > -Wl,--version > collect2 version 4.9.2 > /usr/bin/ld -plugin /usr/lib/gcc/x86_64-linux-gnu/4.9/liblto_plugin.so > -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper > -plugin-opt=-fresolution=/tmp/ccannlod.res -plugin-opt=-pass-through=-lgcc > -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc > -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s > --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu > -dynamic-linker /lib64/ld-linux-x86-64.so.2 > /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crt1.o > /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crti.o > /usr/lib/gcc/x86_64-linux-gnu/4.9/crtbegin.o > -L/usr/lib/gcc/x86_64-linux-gnu/4.9 > -L/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu > -L/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../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/4.9/../../.. --version -lgcc --as-needed > -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed > /usr/lib/gcc/x86_64-linux-gnu/4.9/crtend.o > /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crtn.o > GNU ld (GNU Binutils for Debian) 2.25 > Copyright (C) 2014 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. > > I'm using Debian 8 and this is the Debian gcc package. They may have > applied patches for binutils, but probably nothing that should explain this > behaviour. > > The following script illustrates the issue. > It's simple enough to be an instruction about what commands to run. > The script does not need to be executed if there are concerns about its > safety. > > #!/bin/bash > > set -ve > > TMP_C="tmp.$$.c" > TMP_O="tmp.$$.o" > TMP_A="libtmp.$$.a" > TMP_GNU_SO="libtmp.$$.gnu.so" > TMP_GOLD_SO="libtmp.$$.gold.so" > > cleanup() { > rm -f $TMP_C $TMP_O $TMP_A $TMP_GNU_SO $TMP_GOLD_SO > } > trap cleanup EXIT > > cat > $TMP_C <<EOF > int foo; > int bar = 42; > EOF > > # Create static library with two global symbols. > gcc -g3 -Wall -c $TMP_C -o $TMP_O > rm -f $TMP_A > ar rcs $TMP_A $TMP_O > > # Create a sharerd library with "-Wl,--exclude-libs,ALL" and the GNU ld > linker. > gcc -shared -Wl,-soname,libtmp.so.1 -o $TMP_GNU_SO -Wl,--exclude-libs,ALL > -L. -Wl,--whole-archive -ltmp.$$ -Wl,--no-whole-archive > > # Create a sharerd library with "-Wl,--exclude-libs,ALL" and the GNU gold > linker. > gcc -fuse-ld=gold -shared -Wl,-soname,libtmp.so.1 -o $TMP_GOLD_SO > -Wl,--exclude-libs,ALL -L. -Wl,--whole-archive -ltmp.$$ > -Wl,--no-whole-archive > > # Show the result. > > echo "### GNU ld global symbols" > nm -D $TMP_GNU_SO > > echo "### GNU gold global symbols" > nm -D $TMP_GOLD_SO > > > # Script in uuencoded form > begin 644 - > M(R$O8FEN+V)A<V@*"G-E="`M=F4*"E1-4%]#/2)T;7`N)"0N8R(*5$U07T\] > M(G1M<"XD)"YO(@I435!?03TB;&EB=&UP+B0D+F$B"E1-4%]'3E5?4T\](FQI > M8G1M<"XD)"YG;G4N<V\B"E1-4%]'3TQ$7U-//2)L:6)T;7`N)"0N9V]L9"YS > M;R(*"F-L96%N=7`H*2!["B`@("!R;2`M9B`D5$U07T,@)%1-4%]/("1435!? > M02`D5$U07T=.55]33R`D5$U07T=/3$1?4T\*?0IT<F%P(&-L96%N=7`@15A) > M5`H*8V%T(#X@)%1-4%]#(#P\14]&"FEN="!F;V\["FEN="!B87(@/2`T,CL* > M14]&"@HC($-R96%T92!S=&%T:6,@;&EB<F%R>2!W:71H('1W;R!G;&]B86P@ > M<WEM8F]L<RX*9V-C("UG,R`M5V%L;"`M8R`D5$U07T,@+6\@)%1-4%]/"G)M > M("UF("1435!?00IA<B!R8W,@)%1-4%]!("1435!?3PH*(R!#<F5A=&4@82!S > M:&%R97)D(&QI8G)A<GD@=VET:"`B+5=L+"TM97AC;'5D92UL:6)S+$%,3"(@ > M86YD('1H92!'3E4@;&0@;&EN:V5R+@IG8V,@+7-H87)E9"`M5VPL+7-O;F%M > M92QL:6)T;7`N<V\N,2`M;R`D5$U07T=.55]33R`M5VPL+2UE>&-L=61E+6QI > M8G,L04Q,("U,+B`M5VPL+2UW:&]L92UA<F-H:79E("UL=&UP+B0D("U7;"PM > M+6YO+7=H;VQE+6%R8VAI=F4*"B,@0W)E871E(&$@<VAA<F5R9"!L:6)R87)Y > M('=I=&@@(BU7;"PM+65X8VQU9&4M;&EB<RQ!3$PB(&%N9"!T:&4@1TY5(&=O > M;&0@;&EN:V5R+@IG8V,@+69U<V4M;&0]9V]L9"`M<VAA<F5D("U7;"PM<V]N > M86UE+&QI8G1M<"YS;RXQ("UO("1435!?1T],1%]33R`M5VPL+2UE>&-L=61E > M+6QI8G,L04Q,("U,+B`M5VPL+2UW:&]L92UA<F-H:79E("UL=&UP+B0D("U7 > M;"PM+6YO+7=H;VQE+6%R8VAI=F4*"B,@4VAO=R!T:&4@<F5S=6QT+@H*96-H > M;R`B(R,C($=.52!L9"!G;&]B86P@<WEM8F]L<R(*;FT@+40@)%1-4%]'3E5? > M4T\*"F5C:&\@(B,C(R!'3E4@9V]L9"!G;&]B86P@<WEM8F]L<R(*;FT@+40@ > -)%1-4%]'3TQ$7U-/"@`` > ` > end > > > > Script output: > > ### GNU ld global symbols > 000000000020088c B __bss_start > w __cxa_finalize > 000000000020088c D _edata > 0000000000200898 B _end > 0000000000000630 T _fini > *0000000000200890 B foo* > w __gmon_start__ > 00000000000004d8 T _init > w _ITM_deregisterTMCloneTable > w _ITM_registerTMCloneTable > w _Jv_RegisterClasses > > ### GNU gold global symbols > 0000000000001968 A __bss_start > w __cxa_finalize > 0000000000001968 A _edata > 0000000000001970 A _end > 0000000000000680 T _fini > w __gmon_start__ > 0000000000000528 T _init > w _ITM_deregisterTMCloneTable > w _ITM_registerTMCloneTable > w _Jv_RegisterClasses > >