我有一个旧的可执行文件,它被安排在废料堆中,但它还没有.它依赖于从我的环境中删除的一些库,但我在某些地方工作正常.我想将此可执行文件指向这些存根库.是的,我可以设置LD_LIBRARY_PATH,但是这个可执行文件是从许多脚本中调用的,很多用户和我都喜欢在一个地方修复它.
我没有这方面的来源,并且很难得到它.我在想 - 我可以使用ELF识别编辑器编辑这个文件,并在rpath中添加一个简单的PATH以使其命中新的库吗?这是可能的,或者一旦你创建了一个ELF二进制文件,你就把东西固定到位置并且它们不能移动?
我只是好奇.我创建了一个共享对象:
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.