加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

Linux上rpath规范的@loader_path相当于什么?

发布时间:2020-12-13 22:56:25 所属栏目:Linux 来源:网络整理
导读:在osx加载器上,@ mount_path解析为通用二进制对象的位置,@ executable_path解析为可执行文件的位置.在 Linux上,显然只有$ORIGIN,它解析为可执行路径. linux加载器中是否有隐藏的功能来为通用ELF对象指定动态搜索路径?或者$ORIGIN对于这样的对象可能表现不同
在osx加载器上,@ mount_path解析为通用二进制对象的位置,@ executable_path解析为可执行文件的位置.在 Linux上,显然只有$ORIGIN,它解析为可执行路径. linux加载器中是否有隐藏的功能来为通用ELF对象指定动态搜索路径?或者$ORIGIN对于这样的对象可能表现不同?

Linux也有$LIB和$PLATFORM,但它们没有提供我需要的东西.

解决方法

$ORIGIN是正在加载的对象的位置,因此可执行文件加载的可执行文件和共享库中的不同.

编辑:这是我执行的一项小测试:

~$mkdir /tmp/tests
~$cd /tmp/tests
tests$mkdir good bad
tests$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.out
good

我认为它证明它有效,一切都有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的可执行文件.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读