libgcc_s.so is unnecessarily linked for MIPS

David Daney ddaney at avtrex.com
Thu Jun 15 04:15:51 UTC 2006


Erik Andersen wrote:
> On Wed Jun 14, 2006 at 05:56:16PM -0700, David Daney wrote:
>   
>> As I said before, I am wondering also.  It works on a glibc system, and 
>> is broken on a uClibc system.  Not to say that uClibc is causing it, but 
>> there is a correlation.
>>     
>
> Buildroot builds gcc with the '--enable-shared' option.
>
> $ ./configure --help | grep libgcc
>   --disable-shared        don't provide a shared libgcc
>
> If you edit buildroot/toolchain/gcc/gcc-uclibc-3.x.mk
> and tell it to use --disable-shared it will not use a
> shared libgcc, but instead staticly link libgcc.a into
> each app (which may or may not use any libgcc symbols).
>
>   
While all that is certainly true, the simple hello world program should 
be able to be linked with a tool chain configured with --enable-shared 
*without* having a DT_NEEDED entry for libgcc_s.so.1.  That it does not 
indicates that there is a bug somewhere in the tool chain.

do this : mipsel-linux-gcc -v -o hello-world hello-world.c

And you will see that in the linking stage, you have two instances of 
'--as-needed -lgcc_s --no-as-needed'.  This tells the linker 
(mipsel-linux-ld) to *only* set a DT_NEEDED for libgcc_s.so.1 *if* it is 
required to resolve an undefined symbol in the hello-world executable.

If you run mipsel-linux-nm -D on hello-world, you will see that there 
are no undefined symbols that can be resolved by linking libgcc_s.so.1, 
so it is indeed unneeded.  The problem here is a bug in mipsel-linux-ld 
that causes it to set DT_NEEDED
tag for libgcc_s.so.1 when it is unneeded.

I encountered a seemingly identical  problem about a year ago with a 
glibc based tool chain and thought I had fixed it.  That it still 
appears in a buildroot/uClibc tool chain is unfortunate.  The proper 
place to fix this is in the linker, not some configure hackery to work 
around the problem.

That said, a short term work around would be to pass -static-libgcc on 
the gcc command line when linking.  However if you have several programs 
that all need a lot of the things in libgcc (like exception support or 
floating point emulation), then it may be an overall win to use a shared 
libgcc.

David Daney.





More information about the uClibc mailing list