c++ - 预计 2.6.16 和 2.6.26 内核版本之间出现 "kernel too old"错误

标签 c++ linux linux-kernel

我在运行 Linux (Debian) 且内核为 2.6.26-2-amd64 的机器上构建了一个应用程序,我想在另一台运行 Linux (Suse) 且内核为 2.6.16.60-0.21-smp 的机器上运行此应用程序,但我收到错误“致命:内核太旧”。

我从 Internet 上的研究中了解到,在构建未编译为支持旧内核版本的 glibc 库时可能会发生这种情况,但它通常与 2.4 版本有关。同系列的内核(2.6)是否可能出现此类错误,或者这可能来自其他问题?

另外,我读到这个问题的解决方案是针对使用适当的 --enable-kernel=VERSION 选项编译的另一个版本的 glibc 重建应用程序。作为替代方案,您是否可以将您的应用程序与 glibc 动态链接来解决问题?

感谢您的帮助。

更新:我知道我的问题可能看起来含糊不清或已通过已经提到的解决方案之一解决(动态链接,在另一个 [虚拟] 系统上构建,重建 glibc [考虑到评论,这似乎很棘手我读过它])但我最终要寻找的是防止此类问题的方法。

例如,是否有可能找到与特定版本的 glibc 兼容的 Linux 内核版本?

更新 2:我最终找到了 glibc 的源代码补丁(对于 Debian,但我猜其他发行版也有类似的在线文档),其中(我猜)包含我正在寻找的信息。

From this page :

--- eglibc-2.11.2.orig/debian/sysdeps/linux.mk
+++ eglibc-2.11.2/debian/sysdeps/linux.mk
@@ -0,0 +1,51 @@
[...]
+MIN_KERNEL_SUPPORTED := 2.6.18
[...]
+# Minimum Kernel supported
+with_headers = --with-headers=$(shell pwd)/debian/include
--enable-kernel=$(call xx,MIN_KERNEL_SUPPORTED)
[...]

这解释了“内核太旧”错误。希望它可以帮助其他人。

最佳答案

确定给定 ELF 文件的最低内核版本的一种方法是在其上运行 file,如下所示:

$ echo 'int main(){}' > test.c
$ gcc -o test test.c
$ file test
test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.38, not stripped

这里重要的部分是“for GNU/Linux 2.6.38”,表示最低内核版本。

关于c++ - 预计 2.6.16 和 2.6.26 内核版本之间出现 "kernel too old"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6941332/

相关文章:

linux - 是否可以检查非阻塞套接字是否已关闭?

c++ - 如何在 CentOS 7 中为 C++ 应用程序生成具有完整回溯跟踪的核心转储文件

git - 向邮件列表提交庞大的补丁集

linux - 嵌入式设备为何以及何时会同时具有 NAND 和 NOR?

c++ - 什么构造函数被调用,它不是移动

c++ - 我们如何检测源代码中的所有指针比较? C++

linux - 用于检查客户端计算机上 LDAP.CONF 上的 LDAP 条目数并更新缺失条目的脚本

c++ - 是否可以在不定义类的情况下重载 [] 运算符以访问 char 的特定位?

c++ - 为什么私有(private)继承不能解决静态函数的歧义? (在 MSVC 中测试)

c - xfrm 实现 IPsec