我想设置LD_PRELOAD指向一个共享库,我可能会运行一个64位或32位应用程序。 很明显,共享库和可执行文件必须在比特性上匹配。
$ 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将自动在lib和lib64之间切换,具体取决于应用程序是32位还是64位。 但显然这是行不通的。
有一些窍门,使这项工作? LD_PRELOAD_32,LD_PRELOAD_64? 谢谢!
通过指定库的完整路径,不要让动态链接器调整与二进制体系结构相匹配的搜索路径。 只定义库名称,让链接器为您选择正确的库。 例如:
$ LD_PRELOAD=lib_init.so ./hello32
将在/ lib中搜索lib_init.so
$ LD_PRELOAD=lib_init.so ./hello64
将在/ lib64中搜索
事实证明,您可以在设置LD_PRELOAD(或设置文件/etc/ld.so.preload)时设置使用$ LIB。 麻烦的是$ LIB设置的值取决于你的linux发行版。 啊!
在我有限的测试中,我发现基于Redhat的系统对于64位应用程序具有$ LIB扩展为“lib64”,对于32位应用程序具有“lib”。
但是,在基于debian的发行版中,我发现$ LIB针对64位应用程序扩展为“lib / x86_64-linux-gnu”,针对32位应用程序扩展为“lib / i386-linux-gnu”。 我一直没有找到任何文件,但我已经测试了这一点。
这意味着如果我有:
$ LD_PRELOAD='/$LIB/lib_init.so' ./hello64
和基于Debian的系统,如Ubuntu的我有:
/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时,不要忘记单引号