错误的ELF类,包含32位和64位lib

时间:2017-05-24 08:04:09

标签: c gcc

我正在尝试使用LD_PRELOAD来加载我自己的strcmp库来解决这个问题 我首先尝试使用gcc -shared -fPIC strcmp.c -o strcmp.so编译我的库,但是当我尝试使用LD_PRELOAD=/path/to/lib/strcmp.so ltrace ./exec执行我的文件时,我遇到了错误:

object '/path/strcmp.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS64): ignored

通过比较file /path/to/strcmp.sofile exec,我发现我的exec文件是一个ELF 32位LSB可执行文件,而我的lib是一个ELF 64位LSB共享对象。

然后我尝试用gcc -m32 -shared -fPIC strcmp.c -o strcmp.so编译我的lib,但是在执行时我有同样的错误(但这次使用ELFCLASS32):

object '/path/strcmp.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored

有什么建议吗?如何在我的lib的32位和64位版本中出现相同的错误?

2 个答案:

答案 0 :(得分:1)

您注意到,如果只有一个32位共享库,则在运行64位程序时会收到该警告。如果只有一个64位库,则在运行32位二进制文​​件时会收到该警告。我们需要您的系统同时具有32位和64位版本的库,并允许系统根据需要选择使用哪个版本。您可以通过以下更改来实现:

  • 编译库的32位和64位版本,并将它们分别放在基于RedHat的系统上的/ usr / lib和/ usr / lib64中。不幸的是,Debian使用了不同的库命名方案,但这种方案并不是很一致,因此我将让读者练习确定在Debian系统上放置这两个库的正确位置。
  • 更改预加载以删除所有路径,例如:export LD_PRELOAD=strcmp.so这将使系统在查找32位或64位库时仅搜索正确的库目录。
  • 如果您只想修补一个体系结构(例如32位),然后编译您的库的32位版本,然后将一个空文件编译到同名的64位共享库中。如上所述放置它们。

请注意,这仅在使用系统库目录时有效。甚至/ usr / local / lib和/ usr / local / lib64也不允许。

答案 1 :(得分:0)

您应直接运行32位动态链接器:

ltrace /lib/ld-linux.so.2 --preload /path/to/lib/strcmp.so ./exec