在Linux

时间:2016-04-25 19:33:56

标签: linux 32bit-64bit ld-preload

我想将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? 谢谢!

2 个答案:

答案 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时不要忘记单引号