代码之家  ›  专栏  ›  技术社区  ›  Steve Hanov

如何为旧的linux发行版构建应用程序,并避免致命的错误:内核太旧?

  •  0
  • Steve Hanov  · 技术社区  · 16 年前

    我怎样才能轻松地获得一个2.4内核的版本?我需要的一些库甚至在2003年左右的旧linux发行版上都不可用。是否有apt get install或其他允许我轻松针对旧内核的工具?

    1 回复  |  直到 16 年前
        1
  •  2
  •   nos    16 年前

    最简单的方法是简单地安装 VirtualBox CentOS 3 或者任何合适的2.4内核旧发行版,并在此基础上构建/测试您的应用程序。

    因为你的内核太旧了,所以你很可能依赖于2.4内核中没有的一些特性,所以你必须追踪并修改它。 错误可能只是静态链接到glibc造成的,您可以尝试动态链接到glibc,并静态链接所有其他lib,但要向后兼容,您必须在旧的glibv系统上构建应用程序。使用 lsb 构建工具也会有所帮助

        2
  •  1
  •   Joseph Van Riper    6 年前

    对于我的用例,我不能静态链接我的支持库。而且,当前的Linux发行版似乎在某些情况下很难做到这一点。但我需要我的应用程序二进制文件在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++

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

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