相关疑难解决方法(0)

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

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

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

linux linker elf

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

为什么ld在链接可执行文件时需要-rpath-link,以便需要另一个?

我只是好奇.我创建了一个共享对象:

gcc -o liba.so -fPIC -shared liba.c
Run Code Online (Sandbox Code Playgroud)

还有一个共享对象,它与前者相关联:

gcc -o libb.so -fPIC -shared libb.c liba.so
Run Code Online (Sandbox Code Playgroud)

现在,在创建链接的可执行文件时libb.so,我必须指定-rpath-link to ld,以便在发现liba.so时可以找到它libb.so依赖于它:

gcc -o test -Wl,-rpath-link,./ test.c libb.so
Run Code Online (Sandbox Code Playgroud)

否则ld会抱怨.

为什么,ld必须能够liba.so在链接时找到test?因为对我而言,似乎ld在确认liba.so存在方面做的事情并不多.例如,根据需要readelf --dynamic ./test只运行列表libb.so,所以我想动态链接器必须发现libb.so -> liba.so它自己的依赖关系,并使它自己搜索liba.so.

我在x86-64 GNU/Linux平台上,而main() - 例程在test调用函数libb.so时依次调用函数liba.so.

c gcc rpath shared-libraries ld

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

标签 统计

c ×1

elf ×1

gcc ×1

ld ×1

linker ×1

linux ×1

rpath ×1

shared-libraries ×1