我在 linux 上分发我的应用程序的静态链接二进制版本。但是,在使用 2.4 内核的系统上,我在启动时收到段错误,并显示消息:“致命:内核太旧。”
我怎样才能轻松地启动并运行 2.4 内核的版本?我需要的一些库甚至在 2003 年左右的旧 linux 发行版上都不可用。是否有 apt-get install 或其他可以让我轻松定位旧内核的东西?
我在 linux 上分发我的应用程序的静态链接二进制版本。但是,在使用 2.4 内核的系统上,我在启动时收到段错误,并显示消息:“致命:内核太旧。”
我怎样才能轻松地启动并运行 2.4 内核的版本?我需要的一些库甚至在 2003 年左右的旧 linux 发行版上都不可用。是否有 apt-get install 或其他可以让我轻松定位旧内核的东西?
最简单的方法是简单地安装VirtualBox(或类似的东西,例如 VMWare),安装CentOS 3或任何合适的具有 2.4 内核的旧发行版,然后在其上构建/测试您的应用程序。
因为你得到一个“内核太旧”,你很可能依赖于 2.4 内核中不存在的一些特性,所以你必须追查并返工。该错误可能只是由静态链接到 glibc 引起的,您可以尝试动态链接到 glibc 以及静态链接到所有其他库,但要向后兼容,您必须在旧的 glibv 系统上构建您的应用程序。使用lsb工具构建也有帮助
对于我的用例,我无法静态链接我的支持库。此外,当前的 Linux 发行版似乎在某些情况下很难做到这一点。但是我需要我的应用程序二进制文件在 10 年前的 Linux 系统上运行。
我也不想将自己限制在一个古老的 10 年前的 C/C++ 编译器上。我还发现,由于某种原因,我需要使用的硬件阻止了我安装 10 年前的 Linux 发行版。
所以,我这样做了:
这给了我一个现代编译器,可以编译可以在非常旧的 Linux 系统上运行的二进制文件。我对 32 位和 64 位处理器都这样做了。
从那里,我创建了一系列脚本,允许我使用包含 docker 的交叉编译器来构建我所有的支持库。我确保将编译的二进制文件的 rpath 设置为相对于我的二进制文件的路径(使用-Wl,-rpath,$ORIGIN/../lib
),并构建了一个脚本以从编译器检索任何支持库,g++ -print-search-dirs
用于获取路径,ldd
以获取我需要的支持库我的二进制文件和一些激进的 bash 脚本来查找存在于 search-dirs 中的支持库g++
,将这些库放入我设置的 rpath 中。
从那里,我相应地打包我的二进制文件,以及所有支持的库。
是的,这有点痛苦,但它产生了一个功能齐全的二进制文件,能够在非常旧的 linux 系统上工作,而无需在多个虚拟机上安装不同的 Linux 发行版。
我尝试创建一个合适的交叉编译器(原生于托管我的 docker 镜像的当前 Linux 发行版),但发现它太难使用了,即使我能找到最好的工具来帮助我。在 docker 镜像中编译编译器花费的时间要少得多,而且工作得相当顺利。