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

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

当我编译我的 elf 时,“最佳实践”是让它链接到我能想到的最旧版本的 glibc,这样它就可以在新版本和旧版本的 glibc 上运行。

即,如果我使用 realpath,在readelfglibc 的输出中我们可以看到它既有 GLIBC_2.0 版本又有 GLIBC_2.3 版本,我想使用旧版本,这样我的 ELF 就可以在 glibc 2.0/1/2 上工作。

但是 GLIBC_2.3 版本可能自发布以来就一直在开发和升级,而且我猜 GLIBC_2.0 版本自 glibc 2.3 发布以来就没有改变过。所以我想我希望我的 elf 在有 GLIBC_2.3 版本时使用它,而在没有 GLIBC_2.0 版本时,回退到 GLIBC_2.0 版本。

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

答案1

我从来没有听说过任何这样的做法,更不用说称之为最好的实践。我能想到的最接近的事情是,如果您查看 ELF 恶意软件,您会发现它通常是针对真正旧版本的 Linux 内核和旧版本的 libc 进行编译的。然而,我不确定这算不算“最佳实践”。

考虑到 Linux 如何将 ELF 可执行文件放入内存,我认为明确的回退是不可能的。内核所做的就是根据文件的 PT_LOAD Pheaders 将 ELF 文件的各个部分映射到内存中。 Linux 也映射到“解释器”,通常是/lib/ld-linux.so.2/lib64/ld-linux-x86-64.so.2。该解释器是 libc 的一部分,它负责对libc.so或任何其他共享对象进行任何动态链接。

ELF 文件与任何可用的共享对象相关联,这就是为什么我写到不可能有明确的版本选择。这一切都取决于 ELF 解释器。

相关内容