Description
As the original IBM GCC RPM package which I used as the starting point used the --enable-version-specific-runtime-libs configure switch the consequence is that when you compile/link a program with gcc/g++ that this version-specific runtime search path for shared libraries is compiled into the binary unless you use some precaution with the "-blibpath" linker flag. In order to stay compatible I had to keep that switch, i.e., stick to the same behavior as before.
The four runtime libraries are:
- libgcc (
libgcc_s.a, GCC C runtime library)
- libstdc++ (
libstdc++.a, GCC C++ runtime library)
- libgomp (
libgomp.a, GCC OpenMP runtime library)
- libgfortran (
libgfortran.a, GCC Fortran runtime library)
The GCC version-specific runtime libraries are contained in
/opt/freeware/lib/gcc/<architecture_AIX_level>/<GCC_Level>
|
where
<architecture_AIX_level> = powerpc-ibm-aix5.1.0.0
or powerpc-ibm-aix5.2.0.0
or powerpc-ibm-aix5.3.0.0
or powerpc-ibm-aix6.1.0.0
or powerpc-ibm-aix7.1.0.0
|
and
<GCC_Level> = your GCC version, e.g., 4.7.2
|
In this directory (<prefix>) you find the runtime libraries for the following cases:
- 32-bit compilation, non-thread-safe (
<prefix>)
- 32-bit compilation, thread-safe (
<prefix>/pthread)
- 64-bit compilation, non-thread-safe (
<prefix>/ppc64)
- 64-bit compilation, thread-safe (
<prefix>/pthread/ppc64)
So in order to not have a fixed version-specific runtime library search path contained in your binary you should use a generic search path like /opt/freeware/lib (for 32-bit shared libraries (mostly)) and /opt/freeware/lib/64 (for 64-bit shared libraries).
|
Remarks:
- If you use such a generic search path, though, you need symbolic links from
/opt/freeware/lib and /opt/freeware/lib64 to the specific GCC version that you have installed!
- This works fine until you change (e.g., update) the GCC version, e.g.,
<prefix> changes
- If the GCC version is changed these symbolic links must also be updated.
Solution
- As a consequence, all newer GCC RPM packages contain the following symbolic links to the four runtime libraries listed above (here as an example I only show it for
libgcc_s.a):
/opt/freeware/lib/libgcc_s.a -> <prefix>/libgcc_s.a, 32-bit non-thread-safe
/opt/freeware/lib64/libgcc_s.a -> <prefix>/ppc64/libgcc_s.a, 64-bit non thread-safe
/opt/freeware/lib/pthread/libgcc_s.a -- <prefix>/pthread/libgcc_s.a, 32-bit, thread-safe
/opt/freeware/lib/pthread/ppc64/libgcc_s.a -> <prefix>/pthread/ppc64/libgcc_s.a, 64-bit thread-safe
- Whenever the GCC RPM packages are updated these symbolic links are also updated as part of the RPM package.
- Consequences for 64-bit compilation:
- Your
$CFLAGS must contain "-L/opt/freeware/lib64 -L/opt/freeware/lib" in that order!
- Your
$LDFLAGS must contain "-Wl,-blibpath:/opt/freeware/lib64:/opt/freeware/lib" in that order!