I need to use a self-compiled version of glibc
(2.18), newer than the default one on the system (2.15). I can compile&link a C++ program, but when I try to run it, I get errors about libstdc++.so.6
. (C programs seems to work just fine.) Do I need to recompile gcc
against the newer glibc
for this to work? Why? (Update: I figured this part out, but I have a few other questions at the bottom.)
Here is a sample C++ program:
#include <iostream>
int main()
{
std::cout << "ok\n";
return 0;
}
Following this answer, I compiled it with:
g++ -Wl,--rpath=/path/to/glibc-2.18/lib -Wl,--dynamic-linker=/path/to/glibc-2.18/lib/ld-2.18.so a.cpp
It compiles with no errors, then ldd
says:
$ ldd a.out
linux-vdso.so.1 => (0x00007fff421fe000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f3b96e7f000)
libc.so.6 => /path/to/glibc-2.18/lib/libc.so.6 (0x00007f3b96ad1000)
libm.so.6 => /path/to/glibc-2.18/lib/libm.so.6 (0x00007f3b967cf000)
/path/to/glibc-2.18/lib/ld-2.18.so => /lib64/ld-linux-x86-64.so.2 (0x00007f3b9719d000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f3b965b9000)
But when I try to run it:
$ ./a.out
./a.out: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
This is confusing because it looks like ldd
finds libstdc++.so.6
just fine (the specific version is libstdc++.so.6.0.16
).
Update: The problem seems to have been (not sure) that the new 2.18
dynamic linker is using its own library path which includes only subfolders of /path/to/glibc-2.18/lib
. I got the program to run by adding this new path, followed by the standard paths (/lib', '/usr/lib
, etc) to /path/to/glibc-2.18/etc/ld.so.conf
and running /path/to/glibc-2.18/sbin/ldconfig
. More questions:
Do I absolutely need the new
2.18
dynamic linker to run a program withglibc-2.18
? Can't the standard linker do it? (This would avoid me having to set up and continuously update the paths of the2.18
dynamic linker.)If I compile with the
2.18
dynamic linker but without--rpath
, the program doesn't work. Why?Should I be using
-L/path/to/glibc-2.18/lib
in the compilation command (in addition to--rpath
and--dynamic-linker
)?
strace
might give some insight as to whether it's actually reading the file and getting some other error. – Acordstrace
, and it shows that the2.18
dynamic linker is only looking forlibstdc++
in subfolders of/path/to/glibc-2.18/lib
. I tried without-Wl,--dynamic-linker
(so, using the standard one) and then I getSEGV
. – SpaldingLD_LIBRARY_PATH
orLD_PRELOAD
to coax it into working? – Acord/path/to/gdb-2.18/lib
followed by the standard paths (/lib
,/usr/lib
, etc) to/path/to/gdb-2.18/etc/ld.so.conf
and running/path/to/gdb-2.18/sbin/ldconfig
. My understanding is that this would tell the2.18
linker to look in the old paths as well. However, now I'm confused as to why I still need--rpath
in this case. – Spalding