在Linux中使用LD_PRELOAD混合64位/ 32位环境

我想设置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时,不要忘记单引号