2016-04-25 168 views
3

我想将LD_PRELOAD设置为指向共享库,我可以运行64位或32位应用程序。很明显,共享库和可执行文件必须在比特级上匹配。在Linux中使用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? 谢谢!

+0

我会用一个包装脚本,检查应用程序的位数和相应 – user3159253

+1

设置库尽量不要指定完整路径设置$ LIB时,只是不要忘了单引号。动态链接器将选择正确的一个,例如LD_PRELOAD = lib_init.so – kofemann

+0

@kofemann这正是我正在寻找的。你能否给我一个答案,以便我可以批准它。 –

回答

5

通过指定库的完整路径,您不会让动态链接器根据二进制体系结构调整其搜索路径。只定义库名称并让链接器为您选择正确的库。例如:

$ LD_PRELOAD=lib_init.so ./hello32 

将搜索/ lib目录lib_init.so,而

$ LD_PRELOAD=lib_init.so ./hello64 

将在搜索/ lib64的

2

事实证明,你可以设置LD_PRELOAD设置时使用$ LIB(或者设置文件/etc/ld.so.preload)。麻烦的是$ LIB设置的值取决于你的linux发行版。啊!

在我有限的测试中,我发现基于Redhat的系统将$ LIB扩展为64位应用程序的“lib64”和32位应用程序的“lib”。但是,在基于debian的发行版中,我发现$ LIB针对64位应用程序扩展为“lib/x86_64-linux-gnu”,针对32位应用程序扩展为“lib/i386-linux-gnu”。我一直没有找到任何文件,但我已经测试过这个。

这意味着,如果我有:

$ 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

相关问题