c - 错误的 ELF 类,同时包含 32 位和 64 位库



我正在尝试通过使用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可执行文件,而我的库是一个ELF 64位LSB共享对象。

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

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

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

正如您所注意到的,如果您有一个 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 也是不允许的。

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

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

相关内容

最新更新