2013-01-16 98 views
5

我在一台最新的Linux机器上静态编译并链接了一个程序,并在另一个9岁的Linux中运行它。它给了我一个错误“致命:内核太旧”并退出。具体来说,新版本是Fedora 18(gcc 4.7.2,glibc 2.16,kernel 3.7.2),旧版本是RHEL4.8(glibc 2.3.4,kernel 2.6.9)。由于它是静态链接,glibc版本应该不重要。我想这里的问题是程序调用不在旧内核中的系统调用。编译旧内核程序

如果在旧系统上开发不是一种选择,我该如何在新系统中构建程序并运行在较旧(甚至更好)的系统中?我正在寻找一种在兼容模式下运行gcc的方式,它只调用旧的系统调用。没有运气。

+2

获取旧版本的glibc并链接它。新的glibc不能在旧的内核上运行。 –

回答

5

最简单的选择是始终在旧系统上构建。

或者,将glibc头文件和静态库从旧系统复制到新的并链接到这些新的系统。

如果这不起作用,你将不得不重建glibc --enable-kernel=2.6.9或类似的东西。

+0

谢谢。如果我使用enable-kernel重建glibc,那么我是否必须用该glibc重建所有其他库,比如libjpeg?换句话说,我的自定义glibc链接库存libjpeg? –

+0

我不这么认为。我认为这个标志只是调整系统调用的后端使用,但你仍然使用相同的C库。您可能会发现最新的C库在某个日期后才支持内核,因此您可能需要降级到较旧版本才能返回到目前为止。我不会推荐在系统库中安装较旧的库。只要把它放在你的编译链接的位置(你需要一些定制的编译器标志)。 – ams