![如何让我的ELF同时运行新旧版本的glibc?](https://linux22.com/image/61219/%E5%A6%82%E4%BD%95%E8%AE%A9%E6%88%91%E7%9A%84ELF%E5%90%8C%E6%97%B6%E8%BF%90%E8%A1%8C%E6%96%B0%E6%97%A7%E7%89%88%E6%9C%AC%E7%9A%84glibc%EF%BC%9F.png)
当我编译我的 elf 时,“最佳实践”是让它链接到我能想到的最旧版本的 glibc,这样它就可以在新版本和旧版本的 glibc 上运行。
即,如果我使用 realpath,在readelf
glibc 的输出中我们可以看到它既有 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 解释器。