在多架构设置中使用 /etc/ld.so.preload

发布于 2024-11-07 03:15:23 字数 343 浏览 0 评论 0原文

有没有办法使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

傾旎 2024-11-14 03:15:23

这是可行的:

  1. 将 32 位库放在 /path/lib 下,将 64 位库放在 /path/lib64 下
    它们应该具有相同的名称,
  2. 并将以下行放入 /etc/ld.so.preload 中:
    /path/$LIB/libname.so

$LIB 将自动获取值“lib”(对于 32 位)或“lib64”(对于 64 位)。

This works:

  1. put library under /path/lib for 32bit one, and put the 64bit one under /path/lib64
    and they should have the same name
  2. put the following line in /etc/ld.so.preload:
    /path/$LIB/libname.so

$LIB will get the value "lib" (for 32bit) or "lib64" (for 64bit) automatically.

临风闻羌笛 2024-11-14 03:15:23

没有理由尝试像这样使用 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..

吃兔兔 2024-11-14 03:15:23

可悲的是,我认为答案可能是“不要这样做”。

来自glibcelf/rtld.c

通常没有ld.so.preload文件,它应该只用于紧急情况和测试。因此,公开调用等通常会失败。对不存在的文件使用 access() 比使用 open() 更快。所以我们首先这样做。如果成功,我们几乎会做两倍的工作,但这并不重要,因为它不用于生产用途。

Sadly, I think the answer might be "Don't do that."

From glibc, elf/rtld.c:

There usually is no ld.so.preload file, it should only be used for emergencies and testing. So the open call etc should usually fail. Using access() on a non-existing file is faster than using open(). So we do this first. If it succeeds we do almost twice the work but this does not matter, since it is not for production use.

鸩远一方 2024-11-14 03:15:23

您可以使用路径名中的特殊扩展键来提供 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文