У мене gcc-4.7.2
в моєму середовищі побудований звичай . Система gcc є gcc-4.3.4
.
Я проклеював DT_RUNPATH за всі мої користувацькі бінарні файли gcc та спільні бібліотеки, використовуючиpatchelf --set-rpath
Однак, коли я працююldd
на своєму 4.7.2, cc1
він піднімає систему libstdc++
замість тієї, на яку вказує DT_RUNPATH :
$ ldd /sdk/x86_64/2.11.1/gcc-4.7.2/libexec/gcc/x86_64-suse-linux/4.7.2/cc1
libcloog-isl.so.1 => /sdk/x86_64/2.11.1/gcc-4.7.2/lib/libcloog-isl.so.1 (0x00007f072dce8000)
...
libc.so.6 => /lib64/libc.so.6 (0x00007f072bfe0000)
--> libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f072bcd5000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f072babe000)
/lib64/ld-linux-x86-64.so.2 (0x00007f072df0d000)
Як видно, DT_RUNPATH вказує gcc-4.7.2
місця розташування бібліотеки:
$ readelf -a /sdk/x86_64/2.11.1/gcc-4.7.2/libexec/gcc/x86_64-suse-linux/4.7.2/cc1 | grep PATH
0x000000000000001d (RUNPATH) Library runpath: \
[/sdk/x86_64/2.11.1/gcc-4.7.2/lib64: \
/sdk/x86_64/2.11.1/gcc-4.7.2/lib: \
/sdk/x86_64/2.11.1/gcc-4.7.2/libexec/gcc/x86_64-suse-linux/lib64: \
/sdk/x86_64/2.11.1/gcc-4.7.2/lib/gcc/x86_64-suse-linux/4.7.2]
Я знаю, що libstdc++.so.6
існує в першому записі в DT_RUNPATH :
$ ls -l /sdk/x86_64/2.11.1/gcc-4.7.2/lib64/libstdc++.so*
lrwxrwxrwx .../sdk/x86_64/2.11.1/gcc-4.7.2/lib64/libstdc++.so -> libstdc++.so.6.0.17
lrwxrwxrwx .../sdk/x86_64/2.11.1/gcc-4.7.2/lib64/libstdc++.so.6 -> libstdc++.so.6.0.17
-rwxr-x--- .../sdk/x86_64/2.11.1/gcc-4.7.2/lib64/libstdc++.so.6.0.17
-rwxr-x--- .../sdk/x86_64/2.11.1/gcc-4.7.2/lib64/libstdc++.so.6.0.17-gdb.py
У мене в моєму середовищі не встановлено LD_LIBRARY_PATH :
$ echo $LD_LIBRARY_PATH
$
Якщо я дійсно встановити LD_LIBRARY_PATH , то він знаходить правильну бібліотеку:
export LD_LIBRARY_PATH=/sdk/x86_64/2.11.1/gcc-4.7.2/lib64: \
/sdk/x86_64/2.11.1/gcc-4.7.2/lib: \
/sdk/x86_64/2.11.1/gcc-4.7.2/libexec/gcc/x86_64-suse-linux/lib64: \
/sdk/x86_64/2.11.1/gcc-4.7.2/lib/gcc/x86_64-suse-linux/4.7.2
$ ldd /sdk/x86_64/2.11.1/gcc-4.7.2/libexec/gcc/x86_64-suse-linux/4.7.2/cc1
libcloog-isl.so.1 => /sdk/x86_64/2.11.1/gcc-4.7.2/lib/libcloog-isl.so.1 (0x00007f072dce8000)
...
libc.so.6 => /lib64/libc.so.6 (0x00007f072bfe0000)
--> libstdc++.so.6 => /sdk/x86_64/2.11.1/gcc-4.7.2/lib64/libstdc++.so.6 (0x00007fdf4e560000)
libgcc_s.so.1 => /sdk/x86_64/2.11.1/gcc-4.7.2/lib64/libgcc_s.so.1 (0x00007fdf4e34b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f072df0d000)
- Чому це не підбирає бібліотеку, знайдену в DT_RUNPATH ?
- Як змусити його використовувати
gcc-4.7.2
бібліотеки без використання LD_LIBRARY_PATH ?