如何使我的 ELF 运行 同时使用新旧版本的 glibc?

How to make my ELF run with both new and old version of glibc?

当我编译我的 elf 时,"best practice" 使其与我能用的最旧版本的 glibc 相对应 link,因此它可以在新旧版本的 glibc 上运行。

即如果我使用 realpath,在 glibc 的 readelf 输出中我们可以看到有一个 GLIBC_2.0 版本和一个 GLIBC_2.3 版本,我想使用旧版本所以我的 ELF将在 glibc 2.0/1/2 上工作。

但是GLIBC_2.3版本应该是在发布后才开发和升级的,我猜GLIBC_2.0版本自从glibc 2.3发布后就没变过。所以我想我希望我的小精灵在 GLIBC_2.3 版本存在时使用它,当它不存在时,回退到 GLIBC_2.0 版本。

有可能吗?或者我不明白什么?

不费吹灰之力,这是不可能的。

假设 libc 只不过是一个普通的图书馆。现在,编译和最终 ELF 二进制文件之间发生的链接过程涉及解析使用的符号。 Glibc 符号是版本化的,因为呃......永远,我想,所以你不能对库的两个版本使用相同的编译代码。您需要做的是拥有 两个 版本的程序,运行 正确的版本,具体取决于可用的 glibc 版本。

这里的问题是几乎任何此类功能都需要使用 glibc...

无论如何,您似乎正在解决不同 glibc 实现中的错误。这听起来很糟糕,我并不羡慕你,尤其是因为你似乎不知道你的程序将找到哪个版本的 glibc。对于不能依赖特定可用库的程序,正确的方法是静态链接,这样所有必要的东西都在你的二进制文件中。 AFAIK 应该可以与 glibc 一起使用,并且假设您不是在袖珍计算器上执行此操作,由此产生的最大二进制大小增加约 2MB 不会对您造成真正的伤害。