通常,即使旧程序(从 Linux 内核版本 2.4 的系统复制)也只是在现代 Linux 系统上运行文件,除非它们依赖于大量库或使用框架。
如果复制到旧系统,新程序(通常甚至int main(){return 0;}
)通常无法运行。
如何在现代系统上制作此类动态链接的可执行文件?我不想在 chroot 或虚拟机中设置旧系统。是否可以对旧库进行“交叉编译”?
答案1
在单独的环境(chroot 或 VM)中设置旧系统是最简单的方法。 (在 Debian 下,schroot 和 debootstrap 使这变得简单;参见如何在 64 位 Debian/Ubuntu 上运行 32 位程序?)
可以对旧库版本进行交叉编译:“简单地”安装这些旧库的开发包,并将编译器指向它们。您可能需要重新编译编译器本身以适应较旧的标准库。困难在于正确安装和配置所有开发包。你需要:
- 编译一个旧的标准库。
- 编译库 A,将编译器指向
.a
上一步中生成的标头和文件。 (对于 gcc,传递-nostdinc
和-nostdinc++
选项;其他编译器通常具有类似的标志。) - 沿着依赖链重复此操作,直到编译完程序。