如何为旧的Linux发行版构建一个应用程序,并避免FATAL:内核太旧错误?

时间:2010-01-17 02:05:23

标签: linux linux-kernel static-libraries glibc

我在linux上分发了我的应用程序的静态链接二进制版本。但是,在具有2.4内核的系统上,我在启动时遇到了段错误,并且消息:“致命:内核太旧了。”

如何轻松地使用2.4内核启动并运行版本?我需要的一些库甚至在大约2003年的旧Linux发行版上都没有。有apt-get安装还是可以让我轻松定位旧内核的东西?

2 个答案:

答案 0 :(得分:2)

最简单的方法是简单地安装VirtualBox(或类似的东西,例如VMWare),安装CentOS 3或任何合适的旧发行版与2.4内核,并在其上构建/测试您的应用程序。

由于你的“内核太旧了”,你很可能依赖于2.4内核中没有的一些功能,所以你必须追查并重做它。 这个错误可能只是静态链接到glibc引起的,你可以尝试静态链接到glibc和所有其他libs静态,但为了向后兼容,你必须在旧的glibv系统上构建你的应用程序。使用lsb工具构建也可以提供帮助

答案 1 :(得分:1)

对于我的用例,我无法静态链接支持库。同样,当前的Linux发行版似乎在某些情况下很难做到这一点。但是我需要我的应用程序二进制文件才能在具有10年历史的Linux系统上运行。

我也不想将自己局限于一个古老的10岁的C / C ++编译器。我还发现,由于某种原因,我需要使用的硬件阻止了我安装10年的Linux发行版。

所以,我这样做了:

  1. 已安装docker。
  2. 在docker实例中,安装10年的Linux系统(我使用Debian的Lenny发行版)。这具有使该构建系统可用于任何其他可以运行docker的计算机的优势。
  3. 在docker实例中,构建当前的GNU编译器(当我这样做时为8.3.0)。

这给了我一个现代的编译器,可以编译可以在非常老的Linux系统上运行的二进制文件。我是针对32位和64位处理器执行此操作的。

从那里,我创建了一系列脚本,使我可以使用包含docker的交叉编译器来构建我的所有支持库。我确保将编译后的二进制文件的rpath设置为相对于我的二进制文件的路径(使用-Wl,-rpath,$ORIGIN/../lib),并确保构建脚本来从编译器中检索所有支持库,并使用g++ -print-search-dirs获取路径,ldd来从二进制文件中获取我需要的支持库,以及一些激进的bash脚本来查找g++的搜索目录中存在的支持库,并将这些库放入我设置的rpath中

从那里,我将二进制文件打包,并带有所有支持的库。

是的,这有点痛苦,但是它会产生一个功能齐全的二进制文件,该文件能够在可笑的旧Linux系统上工作,而不必在多个虚拟机上安装不同的Linux发行版。

我尝试创建一个合适的交叉编译器(相对于托管我的docker镜像的当前Linux发行版而言),但发现即使使用最好的工具也很难使用,但我很难使用它。在docker映像中编译该编译器花费的时间少得多,并且工作相当顺利。