我在linux上分发了我的应用程序的静态链接二进制版本。但是,在具有2.4内核的系统上,我在启动时遇到了段错误,并且消息:“致命:内核太旧了。”
如何轻松地使用2.4内核启动并运行版本?我需要的一些库甚至在大约2003年的旧Linux发行版上都没有。有apt-get安装还是可以让我轻松定位旧内核的东西?
答案 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发行版。
所以,我这样做了:
这给了我一个现代的编译器,可以编译可以在非常老的Linux系统上运行的二进制文件。我是针对32位和64位处理器执行此操作的。
从那里,我创建了一系列脚本,使我可以使用包含docker的交叉编译器来构建我的所有支持库。我确保将编译后的二进制文件的rpath设置为相对于我的二进制文件的路径(使用-Wl,-rpath,$ORIGIN/../lib
),并确保构建脚本来从编译器中检索所有支持库,并使用g++ -print-search-dirs
获取路径,ldd
来从二进制文件中获取我需要的支持库,以及一些激进的bash脚本来查找g++
的搜索目录中存在的支持库,并将这些库放入我设置的rpath中
从那里,我将二进制文件打包,并带有所有支持的库。
是的,这有点痛苦,但是它会产生一个功能齐全的二进制文件,该文件能够在可笑的旧Linux系统上工作,而不必在多个虚拟机上安装不同的Linux发行版。
我尝试创建一个合适的交叉编译器(相对于托管我的docker镜像的当前Linux发行版而言),但发现即使使用最好的工具也很难使用,但我很难使用它。在docker映像中编译该编译器花费的时间少得多,并且工作相当顺利。