我有与之前发布的这个问题相同的问题,其中/etc/ld.so.preload
不拦截正确的架构。一点背景知识:我编译了一个共享对象(64 位),它ld.so.preload
在任何二进制执行的文件中都被引用。问题是我ERROR: ld.so: object '/usr/local/lib/mysharedobject.so' from /etc/ld.so.preload cannot be preloaded (wrong ELF class: ELFCLASS64): ignored.
在执行 32 位程序时遇到了问题。
要根据该问题的答案解决问题,我必须创建两个目录(例如 in )lib/i386-linux-gnu
并指定in ,以便根据程序架构预加载正确的库。 x86_64-linux-gnu
/var/opt
/var/opt/$LIB/mysharedobject.so
/etc/ld.so.preload
因此,在这种情况下,在基于 Debian 的系统中,/var/opt/$LIB/mysharedobject.so
将扩展为:
/var/opt/lib/i386-linux-gnu/mysharedobject.so
对于 32 位程序;/var/opt/x86_64-linux-gnu/mysharedobject.so
对于 64 位程序。
但是,应用此功能后,我运行的任何二进制文件(例如ls
)都将输出以下“错误”:
ERROR: ld.so: object '/var/opt/$LIB/mysharedobject.so' from /etc/ld.so.preload cannot be preloaded (cannot open shared object file): ignored.
如您所见,$LIB 没有扩展到任何东西。我还设置并运行$LD_LIBRARY_PATH
以使用此库更新系统,但没有成功。这里有什么问题?/var/opt
ldconfig
shell会扩展
$LIB
,但是当你这样做时这是不可能的:提到的手册页
/etc/ld.so.preload
没有提到全局扩展或环境变量的可能性:当您停下来思考如何使用数据时,这也不太可能:
现在......手册页提到
$LIB
可以在 rpath 和 中使用LD_PRELOAD
,但它也说这是一个会影响您的陷阱,因为它
/var/opt
可能不是标准的搜索目录。终于解决了问题。
$LIB
环境变量扩展到lib32
32 位程序和lib/x86_64-linux-gnu
64 位程序的目录(如/usr/$LIB/mysharedlibrary.so
中/etc/ld.so.preload
) - 如中所示strace
。这适用于基于 Debian 的系统,对于其他系统,它将扩展到lib64
和lib
(总是可以用 来确认strace
,更具体地说是openat()
系统调用)。因此解决方案是使用两者编译共享库,
-m32
并将-m64
相关架构文件从$LIB
.总结(示例):