gcc 4.0.0 x86_64 static linking of libstdc++.a

Nix nix@esperi.org.uk
Tue May 24 13:41:00 GMT 2005

On 23 May 2005, Roland Lengfeldner suggested tentatively:
> I'm facing the following problem: I want to create a shared library on Linux
> (Red Hat Enterprise 3) / Opteron, with gcc 4.0.0 & binutils 2.16. When
> compiling in 32-bit mode (with -m32) everything works, but in 64-bit mode
> (with -m64) the following error message appears:
> gcc -shared   {list of .o files}  -ldl -lm
> /opt/dessup/gnu_2004/gcc400/opt3/lib/gcc/x86_64-unknown-linux-gnu/4.0.0/../../../../lib64/libstdc++.a
>  -m64 -static-libgcc -fPIC 
> -Wl,-soname -Wl,libAGENT.so.1 -o .libs/libAGENT.so.1.0.0

Linking non-PIC code (as is generally contained in static libraries)
into shared libraries is not portable and can't be guaranteed to work.
(The GNU C library's dynamic linker fixes it up in many cases, but it
*will* fail on other OSes, notably Solaris).

> /opt/dessup/gnu_2004/gcc400/opt3/bin/ld:
> /opt/dessup/gnu_2004/gcc400/opt3/lib/gcc/x86_64-unknown-linux-gnu/4.0.0/../../../../lib64/libstdc++.a(functexcept.o):
> relocation R_X86_64_32 against `std::bad_typeid::~bad_typeid()' can not be
> used when making a shared object; recompile with
> -fPIC

Well, that's pretty clear: recompile libstdc++.a with -fPIC (which means
rebootstrapping GCC with distinctly unusual CXXFLAGS) or take out that
explciit linkage to libstdc++.a.

(You should be using the c++ or g++ drivers for this, anyway.)

> What does the error message mean? Is gcc 4.0.0 (or at least libstdc++.a)
> miscompiled, or is it a gcc configuration problem:

Neither: you're doing something risky, inefficient and not a good idea :/

`Once again, I must remark on the far-reaching extent of my
 ladylike nature.' --- Rosie Taylor

More information about the Gcc-help mailing list