为什么Linux rpath只对某些库起作用

时间:2020-10-27 09:08:56

标签: linux linker

我用-Wl,-rpath =。/链接我的程序。 但它无法搜索库。调试显示运行路径仅对某些库起作用。日志:

find library=libepsverifier.so [0]; searching
search path=./tls/x86_64/x86_64:./tls/x86_64:./tls/x86_64:./tls:./x86_64/x86_64:./x86_64:./x86_64:.     (RUNPATH from file ./sim)
trying file=./tls/x86_64/x86_64/libepsverifier.so
 trying file=./tls/x86_64/libepsverifier.so
trying file=./libepsverifier.so


find library=libc.so.6 [0]; searching
search path=./tls/x86_64/x86_64:./tls/x86_64:./tls/x86_64:./tls:./x86_64/x86_64:./x86_64:./x86_64:.     (RUNPATH from file ./sim)
trying file=./tls/x86_64/x86_64/libc.so.6
...
trying file=./x86_64/libc.so.6
trying file=./libc.so.6
search cache=/etc/ld.so.cache
trying file=/lib/x86_64-linux-gnu/libc.so.6

find library=libepsbase.so [0]; searching
search cache=/etc/ld.so.cache
search path=/lib/x86_64-linux-gnu/tls/x86_64/x86_64:/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-gnu/tls:/lib/x86_64-linux-gnu/x86_64/x86_64:/lib/x86_64-linux-gnu/x86_64:/lib/x86_64-linux-gnu/x86_64:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu/tls/x86_64/x86_64:/usr/lib/x86_64-linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-gnu/tls:/usr/lib/x86_64-linux-gnu/x86_64/x86_64:/usr/lib/x86_64-linux-gnu/x86_64:/usr/lib/x86_64-linux-gnu/x86_64:/usr/lib/x86_64-linux-gnu:/lib/tls/x86_64/x86_64:/lib/tls/x86_64:/lib/tls/x86_64:/lib/tls:/lib/x86_64/x86_64:/lib/x86_64:/lib/x86_64:/lib:/usr/lib/tls/x86_64/x86_64:/usr/lib/tls/x86_64:/usr/lib/tls/x86_64:/usr/lib/tls:/usr/lib/x86_64/x86_64:/usr/lib/x86_64:/usr/lib/x86_64:/usr/lib     (system search path)
trying file=/lib/x86_64-linux-gnu/tls/x86_64/x86_64/libeps
。。。
trying file=/usr/lib/x86_64/libepsbase.so
trying file=/usr/lib/x86_64/libepsbase.so
trying file=/usr/lib/libepsbase.so
./sim: error while loading shared libraries: libepsbase.so: cannot open shared object file: No such file or directory

为什么在中搜索libepsverifier。 但链接器不会在。下搜索libepsbase。

2 个答案:

答案 0 :(得分:0)

我不确定您要实现什么,说实话,我从未尝试过使用rpath来尝试使用它。如果您希望编译器扫描整个文件系统,对吗?这不是什么意思。

可能找到了其他库,因为它们是在您环境的LD_LIBRARY_PATH中引用的,或者是因为它们位于您的环境识别为“库所在的位置”的位置。

序列应为

  1. 可执行文件的DT_RPATH部分
  2. LD_LIBRARY_PATH
  3. 可执行文件的DT_RUNPATH部分
  4. / etc / ld / so / cache
  5. 默认目录/ lib然后是/ usr / lib

要进行适当的测试,请在LD_LIBRARY_PATH中包含库的路径,或将rpath与库的完整路径一起传递。如果有效,这就是失败的原因。

答案 1 :(得分:0)

如果希望在搜索库本身依赖的共享库时也使用该路径,则在编译共享库时应使用相同的-Wl,-rpath=/some/path选项。

示例:

$ echo 'void bar(){printf("bar\n");}' > bar.c
$ echo 'extern void bar(); void foo(){bar();}' > foo.c
$ echo 'extern void foo(); int main(){foo();}' > main.c

$ mkdir -p dir
$ cc bar.c -shared -o dir/libbar.so -include stdio.h
$ cc foo.c -Ldir -lbar -shared -o dir/libfoo.so
$ cc main.c -Ldir -lfoo -o main -Wl,-rpath=./dir
$ ./main
./main: error while loading shared libraries: libbar.so: cannot open shared object file: No such file or directory

$ cc foo.c -Ldir -lbar -shared -o dir/libfoo.so -Wl,-rpath=./dir
                                               #^^^^^^^^^^^^^^^^
$ ./main
bar