我正在尝试使用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.so
和file 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位版本中出现相同的错误?
答案 0 :(得分:1)
您注意到,如果只有一个32位共享库,则在运行64位程序时会收到该警告。如果只有一个64位库,则在运行32位二进制文件时会收到该警告。我们需要您的系统同时具有32位和64位版本的库,并允许系统根据需要选择使用哪个版本。您可以通过以下更改来实现:
export LD_PRELOAD=strcmp.so
这将使系统在查找32位或64位库时仅搜索正确的库目录。请注意,这仅在使用系统库目录时有效。甚至/ usr / local / lib和/ usr / local / lib64也不允许。
答案 1 :(得分:0)
您应直接运行32位动态链接器:
ltrace /lib/ld-linux.so.2 --preload /path/to/lib/strcmp.so ./exec