我想将LD_PRELOAD设置为指向共享库,我可以运行64位或32位应用程序。很明显,共享库和可执行文件必须匹配bit-ness。
$ LD_PRELOAD=/lib64/lib_init.so ./hello32
ERROR: ld.so: object '/lib64/lib_init.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS64): ignored
其中hello32是32位应用程序。世界上有一些页面说我应该能够做到:
$ LD_PRELOAD='/$LIB/lib_init.so' ./hello32
ERROR: ld.so: object '/$LIB/lib_init.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored
其中$ LIB将根据应用程序是32位还是64位自动在lib和lib64之间切换。但显然这不起作用。
是否有一些技巧可以使这项工作? LD_PRELOAD_32,LD_PRELOAD_64? 谢谢!
答案 0 :(得分:5)
通过指定库的完整路径,您不允许动态链接器根据二进制体系结构调整其搜索路径。仅定义库名称,让链接器为您选择正确的库。 E.g:
$ LD_PRELOAD=lib_init.so ./hello32
将在/ lib中搜索lib_init.so,而
$ LD_PRELOAD=lib_init.so ./hello64
将在/ lib64中搜索
答案 1 :(得分:2)
事实证明,在设置LD_PRELOAD(或设置文件/etc/ld.so.preload)时可以设置使用$ LIB。麻烦的是$ LIB设置的值取决于你的linux发行版。 UGH!
在我的有限测试中,我发现基于Redhat的系统将$ LIB扩展到" lib64"对于64位应用程序和" lib"适用于32位应用程序。
然而,在基于debian的发行版中,我发现$ LIB扩展为" lib / x86_64-linux-gnu"对于64位应用程序和" lib / i386-linux-gnu"适用于32位应用程序。我还没有找到关于此的任何文档,但我已经对此进行了测试。
这意味着如果我有:
$ LD_PRELOAD='/$LIB/lib_init.so' ./hello64
在像ubuntu这样基于debian的系统上我有:
/lib/x86_64-linux-gnu/lib_init.so (for 64bit apps)
和
/lib/i386-linux-gnu/lib_init.so (for 32bit apps)
这样可以正常工作(在基于ubuntu的Linux计算机上)
否则,在基于redhat的发行版中,您需要
/lib64/lib_init.so and /lib/lib_init.so
适用于64位和32位应用。
使用LD_PRELOAD =' / $ LIB / lib_init.so'有一个优点是你不依赖于$ LD_LIBRARY_PATH的值。
在LD_PRELOAD设置$ LIB时不要忘记单引号