在多架构设置中使用 /etc/ld.so.preload
有没有办法使用 ld.so.preload 并覆盖 32 位和 64 位二进制文件?
如果我在 ld.so.preload 中列出故障处理程序的 32 位和 64 位版本,那么加载程序总是抱怨其中一个版本无法预加载我运行的任何命令。不完全是惊天动地,因为错误更多的是警告,但我当然可以不用打印输出。
我没有指定绝对路径,而是尝试简单地指定“segv_handler.so”,希望加载程序能够在架构适当的路径中选择库(32 位版本位于 /lib 中,64 位版本位于 /lib64 中)。
显然不太可能。
有没有办法设置 ld.so.preload 以了解架构?或者如果没有,有什么方法可以关闭错误消息吗?
Is there some way to use ld.so.preload and cover both 32bit and 64bit binaries?
If I list both the 32bit and 64bit versions of the fault handler in ld.so.preload then the loader always complains that one of them fails to preload for whatever command I run. Not exactly earth shaking since the error is more a warning but I could certainly do without the printout.
Instead of specifying an absolute path I tried specifying simply "segv_handler.so" in the hopes that the loader would choose the lib in the arch appropriate path (a 32bit version is in /lib and a 64bit version is in /lib64).
Not likely apparently.
Is there a way to setup ld.so.preload to be architecturally aware? Or if not is there some way to turn off the error message?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这是可行的:
它们应该具有相同的名称,
/path/$LIB/libname.so
$LIB 将自动获取值“lib”(对于 32 位)或“lib64”(对于 64 位)。
This works:
and they should have the same name
/path/$LIB/libname.so
$LIB will get the value "lib" (for 32bit) or "lib64" (for 64bit) automatically.
没有理由尝试像这样使用 ld.so.preload 。默认情况下,ld 足够聪明,可以知道如果您运行 64 位应用程序,则仅查找 64 位库,对于 32 位也是如此。
举个例子,如果你有
/lib64/libawesome.so
/lib/libawesome.so
你尝试
gcc -lawesome -o funtime funtime.c
它会选择 gcc 想要构建的默认值, ld 会跳过该构建的不正确位大小的库。
gcc -m64 -lawesome -o funtime funtime.c 将选择 64 位版本
gcc -m32 -lawesome -o funtime funetime.c 将选择 32 位版本。
这假设 /etc/ld.so.conf 默认列出 /lib 和 /lib64 。
There's no reason to try to use ld.so.preload like this. By default ld is smart enough to know that if you're running a 64bit app to only lookup 64bit libs, and same with 32bit.
Case in point, if you have
/lib64/libawesome.so
/lib/libawesome.so
And you try
gcc -lawesome -o funtime funtime.c
It'll choose whatever the default that gcc wants to build, ld will skip libraries of incorrect bit size for that build.
gcc -m64 -lawesome -o funtime funtime.c will pick the 64bit one
gcc -m32 -lawesome -o funtime funetime.c will pick the 32bit one.
This presumes that /etc/ld.so.conf lists /lib and /lib64 by default..
可悲的是,我认为答案可能是“不要这样做”。
来自
glibc
、elf/rtld.c
:Sadly, I think the answer might be "Don't do that."
From
glibc
,elf/rtld.c
:您可以使用路径名中的特殊扩展键来提供 32 和 64 位库。
例如,您可以使用
/lib/$PLATFORM/mylib.so
并创建/lib/i386/mylib.so
和/lib/x86_64/mylib.so
。 Linked 将为您的可执行文件选择正确的一个。You can provide 32 and 64 bit library using special expansion keys in the path name.
For instance you can use
/lib/$PLATFORM/mylib.so
and create/lib/i386/mylib.so
and/lib/x86_64/mylib.so
. Linked will choose the correct one for your executable.