我在运行 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,但我猜其他发行版也有类似的在线文档),其中(我猜)包含我正在寻找的信息。
--- 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/