相关疑难解决方法(0)

我可以在已编译的二进制文件中更改"rpath"吗?

我有一个旧的可执行文件,它被安排在废料堆中,但它还没有.它依赖于从我的环境中删除的一些库,但我在某些地方工作正常.我想将此可执行文件指向这些存根库.是的,我可以设置LD_LIBRARY_PATH,但是这个可执行文件是从许多脚本中调用的,很多用户和我都喜欢在一个地方修复它.

我没有这方面的来源,并且很难得到它.我在想 - 我可以使用ELF识别编辑器编辑这个文件,并在rpath中添加一个简单的PATH以使其命中新的库吗?这是可能的,或者一旦你创建了一个ELF二进制文件,你就把东西固定到位置并且它们不能移动?

linux linker elf

81
推荐指数
3
解决办法
5万
查看次数

ld:在共享库中使用-rpath,$ ORIGIN(递归)

我只是做了使用ld的一个基本的例子-rpath选项与$ORIGIN 这里(见一个工作版本第二反应).我试图创造一个例子main.run链接foo.so,进而链接bar.so,全部采用rpath$ORIGIN.

运行时文件结构是:

  • 项目/
    • LIB /
      • DIR /
        • 子/
          • bar.so
        • foo.so
    • 跑/
      • main.run(无法构建)

我正在建设foo.so使用:

g++ -c -o obj/foo.o src/foo.cpp -fPIC
g++ -shared -o lib/dir/foo.so obj/foo.o -Wl,-soname,foo.so -Wl,-rpath,'$ORIGIN/sub' -Llib/dir/sub -l:bar.so
Run Code Online (Sandbox Code Playgroud)

哪个建好了.ldd lib/dir/foo.so甚至可以找到bar.so.

但是,当我尝试链接main.run到时foo.so,foo.so找不到bar.so.

我正在构建main.so使用:

g++ -c -o obj/main.o src/main.cpp
g++ -o run/main.run obj/main.o -Wl,-rpath,'$ORIGIN/../lib/dir' -Llib/dir -l:foo.so
Run Code Online (Sandbox Code Playgroud)

如果foo.so使用不递归链接的另一个版本,这可以正常工作.(取消注释make.sh中的行,在下面的项目中进行测试).

但是,使用正常foo.so我在构建时遇到此错误main.run:

/ usr/bin/ld:警告:bar.so,lib/dir/foo.so需要,找不到(尝试使用-rpath或-rpath-link) …

linux linker shared rpath

29
推荐指数
3
解决办法
3万
查看次数

标签 统计

linker ×2

linux ×2

elf ×1

rpath ×1

shared ×1