views:

174

answers:

1

Hi all,

A simple question - is there any way to make the g++ linker to link with a specific libstdc++ library version? I didn't find anything useful in the man page of gcc/g++, neither in other questions here.

Here's the situation - my application uses a specific shared library, that's built with libstdc++.so.5 and I want to install and use it on RHEL5. So, when I try to build the application on a RHEL5 machine, I got the warning:

warning: libstdc++.so.5, needed by ..the_shared_library_.. may conflict with libstdc++.so.6

Installing a compat-libstdc++ rpm didn't help, the program crashes on a destructor of std::string, because of the incapability. So, on this RHEL5 machine I have this:

[root@xxx]# ll /usr/lib/libstd*
-rwxr-xr-x 1 root root 259532 Aug 21 2006 /usr/lib/libstdc++-3-libc6.2-2-2.10.0.so
lrwxrwxrwx 1 root root 31 Jul 28 19:35 /usr/lib/libstdc++-libc6.2-2.so.3 -> libstdc++-3-libc6.2-2-2.10.0.so
lrwxrwxrwx 1 root root 18 Aug 24 15:08 /usr/lib/libstdc++.so.5 -> libstdc++.so.5.0.7
-rwxr-xr-x 1 root root 733456 Aug 21 2006 /usr/lib/libstdc++.so.5.0.7

and when I make

[root@xxxx]# ldd my_exe
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00333000)
...
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x00ddf000)

which is bad, as I know it's undefined behavior :/
So, is there any way to build my executable using only libstdc++.so.5 ? (removing libstdc++.so.6 is not an option because of many reasons. Static linking is not an option, too ).

Thanks a lot!

BR,
Kiril

+2  A: 

Here's the ABI versions table; the default value for the -fabi-version switch changed from 1 to 2 at the same time g++ introduced libstdc++.so.6 with 3.4. This means that to link against the older libstdc++ library you would need to

  • find and use the equivalent C++ headers instead of the ones included with your compiler
  • recompile all your code (and any other C++ libraries you're using) with -fabi-version=1

otherwise you run the risk of ABI incompatibilities. I can't tell you precisely what the changes were but in general it's best to try and keep all C++ code you have compiled with the same compiler version.

Assuming you don't want to try and hack things togther like this I think you have two choices:

  1. ask your shared library vendor to recompile the library with your version of GCC for you. This may not be trivial as g++ 3.4 introduced a new stricter C++ parser.
  2. ask your vendor which version of g++ they used to compile the library in the first place and use that version to compile your own code. RH might provide a compat-gcc compiler as well as the libstdc++ - I can't remember. However you'll also need down-level versions of all other libraries and OS-provided C++ libraries that you're using, so might be easiest to compile on a VM with an older Red Hat version that had the right compiler.
Rup
Okay, I tried the first option, still nothing .. I'm still waiting for help there, so I don't really think that they will recompile the library. About the second one - I need to use the application on a RHEL5 machine, so I don't need older OS libraries, just the libstdc++. If they tell me which gcc version they have used for compiling the oracle library (OCCI 10.2.0.3), I'll make a virtual machine with RHEL5 and the specific gcc version. Hope that will help :/ Thanks for the response! BR, Kiril
Kiril Kirov
Sorry that doesn't help :-/ At a pinch you could run a separate process for the libstdc++.so.5 code and pass data between the two using IPC. It might even be possible to write a C wrapper library with the older GCC and link that into your newer code so there's no C++ boundary between the two but you'd have to be very careful about the library link order there.
Rup
Ah, yes, that's a really good idea! Unfortunately, I don't have time to implement it for this issue, but this would be really helpful for other applications. Very interesting idea. Thanks!
Kiril Kirov
Hi again! I just wanted to tell you that the problem is fixed and, yes, Rup, you're right. The thing, that solved the issue is just a new build of the library, with gcc 3.4.3, instead of 3.2.3 (: Thanks for you help! Best regards, Kiril Kirov
Kiril Kirov