【问题标题】:Compiling program for old kernel旧内核的编译程序
【发布时间】:2012-12-31 01:53:29
【问题描述】:

我在一台最新的 Linux 机器上静态编译和链接了一个程序,然后在另一个 9 岁的 Linux 上运行它。它给了我一个错误“致命:内核太旧”并退出。具体来说,新版本是 Fedora 18(gcc 4.7.2,glibc 2.16,内核 3.7.2),旧版本是 RHEL4.8(glibc 2.3.4,内核 2.6.9)。由于它是静态链接,因此 glibc 版本无关紧要。我猜这里的问题是程序调用了旧内核中没有的系统调用。

如果不能在旧系统上开发,我如何在新系统中构建程序并在旧系统中运行(甚至更好,两者都可以)?我正在寻找一种在兼容模式下运行 gcc 的方法,它只调用旧的系统调用。还没有运气。

【问题讨论】:

  • 获取旧版本的 glibc 并链接到它。新的 glibc 不会在旧内核上运行。

标签: linux gcc kernel version glibc


【解决方案1】:

最简单的选择是始终在旧系统上构建。

或者,将 glibc 头文件和静态库从旧系统复制到新系统并链接到它们。

如果这不起作用,您将不得不使用 --enable-kernel=2.6.9 或类似的东西重新构建 glibc。

【讨论】:

  • 谢谢。如果我使用 enable-kernel 重建 glibc,我是否必须使用该 glibc 重建所有其他库,例如 libjpeg?换句话说,我的自定义 glibc 可以与 stock libjpeg 链接吗?
  • 我不这么认为。我认为该标志仅调整系统调用的后端使用,但您仍在使用相同的 C 库。不过,您可能会发现最新的 C 库仅在某个日期之后才支持内核,因此您可能需要降级到旧版本才能回到那一步。我不建议将旧库安装为系统库。只需将它放在可以链接到它以进行构建的地方(您需要一些自定义编译器标志)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多