linux也有$liB和$PLATFORM,但它们没有提供我需要的东西.
解决方法 $ORIGIN是正在加载的对象的位置,因此可执行文件加载的可执行文件和共享库中的不同.编辑:这是我执行的一项小测试:
~$mkdir /tmp/tests~$cd /tmp/teststests$mkdir good badtests$gcc -fPIC -shared -o good/libtest.so -Wl,-rpath,$ORIGIN -x c - <<< 'int puts(const char*); voID foo() { puts("good"); }'tests$gcc -fPIC -shared -o bad/libtest.so -Wl,$ORIGIN -x c - <<< 'int puts(const char*); voID foo() { puts("bad"); }'tests$gcc -fPIC -shared -o good/libtest2.so -Wl,$ORIGIN -x c - -ltest -Lgood <<< 'voID foo(); voID bar() { foo(); }'tests$gcc -o bad/a.out good/libtest2.so -x c - -Wl,$ORIGIN -Wl,-rpath-link,good <<< 'voID bar(); int main() { bar(); }'tests$tests$readelf -d bad/* good/* | grep RPATH 0x000000000000000f (RPATH) library rpath: [$ORIGIN] 0x000000000000000f (RPATH) library rpath: [$ORIGIN] 0x000000000000000f (RPATH) library rpath: [$ORIGIN] 0x000000000000000f (RPATH) library rpath: [$ORIGIN]tests$tests$ldd bad/a.out linux-vdso.so.1 => (0x00007faf2f295000) good/libtest2.so (0x00007faf2f092000) libc.so.6 => /lib64/libc.so.6 (0x0000003949800000) libtest.so => /tmp/tests/good/libtest.so (0x00007faf2ee66000) /lib64/ld-linux-x86-64.so.2 (0x0000003949400000)tests$bad/a.outgood
我认为它证明它有效,一切都有RPATH = $ORIGIN,可执行文件显式链接到libtest2.so,它在自己的目录中获取libtest.so而不是可执行文件.
使用LD_DEBUG = libs bad / a.out显示:
[...] 17779: find library=libtest.so [0]; searching 17779: search path=/tmp/tests/good/tls/x86_64:/tmp/tests/good/tls:/tmp/tests/good/x86_64:/tmp/tests/good (RPATH from file good/libtest2.so)[...]
即当查找good / libtest2.so的libtest.so依赖时,搜索路径使用来自good / libtest2.so的RPATH,它扩展为/ tmp / tests / good,这是来自good / libtest2.so的$ORIGIN而不是$ORIGIN的可执行文件.
总结以上是内存溢出为你收集整理的Linux上rpath规范的@loader_path相当于什么?全部内容,希望文章能够帮你解决Linux上rpath规范的@loader_path相当于什么?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)