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

标签 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 编译我的库,但是在执行时我有同样的错误(但这次是 ELFCLASS32):

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

有什么建议吗?我的 lib 的 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 也是不允许的。

关于c - 包含 32 位和 64 位库的错误 ELF 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44152468/

相关文章:

c - 使用 SWIG 将指向结构的指针从 TCL 传递到 C 函数

C 识别 -l 标志的库名称?

gcc - CMake 报告 GCC 已损坏。我从哪里开始?

c++ - 如何在 Visual Studio 中查找静态 c/c++ 库中的函数

c - 在 gcc 中将 NULL 分配给 double 类型的引用指针会产生错误

c - 为什么这个数组符号在 C 中是非法的?

c - 数组类型有不完整的元素类型错误

android - 如何链接在android中使用ndk-build创建的静态库

linux - 静态编译glfw

c - 为什么这些构造使用前后递增的未定义行为?