2

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

我怎样才能轻松地启动并运行 2.4 内核的版本?我需要的一些库甚至在 2003 年左右的旧 linux 发行版上都不可用。是否有 apt-get install 或其他可以让我轻松定位旧内核的东西?

4

2 回答 2

2

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

因为你得到一个“内核太旧”,你很可能依赖于 2.4 内核中不存在的一些特性,所以你必须追查并返工。该错误可能只是由静态链接到 glibc 引起的,您可以尝试动态链接到 glibc 以及静态链接到所有其他库,但要向后兼容,您必须在旧的 glibv 系统上构建您的应用程序。使用lsb工具构建也有帮助

于 2010-01-17T02:25:49.950 回答
2

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

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

所以,我这样做了:

  1. 安装了码头工人。
  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 脚本来查找存在于 search-dirs 中的支持库g++,将这些库放入我设置的 rpath 中。

从那里,我相应地打包我的二进制文件,以及所有支持的库。

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

我尝试创建一个合适的交叉编译器(原生于托管我的 docker 镜像的当前 Linux 发行版),但发现它太难使用了,即使我能找到最好的工具来帮助我。在 docker 镜像中编译编译器花费的时间要少得多,而且工作得相当顺利。

于 2020-02-22T12:49:02.380 回答