【问题标题】:Various glibc and Linux kernel versions compatibility各种 glibc 和 Linux 内核版本的兼容性
【发布时间】:2015-01-26 02:23:01
【问题描述】:

在构建编译器时,除了 glibc 版本之外,还必须指定 Linux 头文件版本和最低支持的内核版本。然后在目标机器上有实际的内核版本和 glibc 版本(具有自己的内核头文件版本和最低支持的内核版本)。我很困惑试图理解这些版本是如何结合在一起的。

示例 1:假设我有针对内核头文件 3.14 构建的带有 glibc 2.13 的系统。这有任何意义吗? glibc 2.13(2011 年发布)如何使用 3.14(2014 年发布)的新内核功能?

示例 2:假设我有一个 glibc 版本更新2.13 的编译器。编译的程序可以在带有 glibc 2.13 的系统上运行吗?如果编译器的 glibc 版本比 2.13

示例 3:来自https://sourceware.org/glibc/wiki/FAQ#What_version_of_the_Linux_kernel_headers_should_be_used.3F 我了解到,如果它满足编译 glibc 时使用的“最低内核版本”,则可以使用旧内核。但是我不明白The other way round (compiling the GNU C library with old kernel headers and running on a recent kernel) does not necessarily work as expected. For example you can't use new kernel features if you used old kernel headers to compile the GNU C library.的段落。这是唯一可能发生在我身上的事情吗?如果内核比编译时更新,它不会破坏 glibc 中的某些内容吗?

示例 4:在 glibc 设置中做更细微的区别(例如,将可执行文件与根据内核头文件 3.Y 编译的 glibc 版本链接内核版本 2.6.A 并在具有相同 glibc 2.X 的系统上执行,但针对内核头文件 3.Z 编译并支持最小值内核版本 2.6.B) 有什么影响吗?我怀疑他们不是,但想确定一下。

这么多问题 :) 谢谢!

【问题讨论】:

标签: c linux linux-kernel cross-compiling crosstool-ng


【解决方案1】:
  1. 你不能轻易地(对于这个词的任何定义)在旧版本的 glibc 中使用更新的内核特性。如果您确实需要,您可以直接调用系统调用(使用syscall() 库函数)并从用户空间内核头文件中挖掘所需的任何常量值和数据结构(新内核中的内容保存在include/uapi 下) .另一方面,内核开发人员通常承诺不会破坏较新内核中的遗留功能,因此较旧的 glibc 版本会继续按预期工作(嗯,几乎)。

  2. 较旧的程序仍然可以使用较新版本的 glibc,因为 glibc 支持符号版本控制(有关详细信息,请参阅此处:https://www.kernel.org/pub/software/libs/glibc/hjl/compat/)。如果您的程序在没有特殊规定的情况下与新版本的 glibc 动态链接(如上面的链接中所述),您将无法使用旧版本的 glibc 库运行它(动态链接器将抱怨未解析的符号,作为正确的符号版本将不可用)。

【讨论】:

  • 我明白了。所以目标上的 glibc 不应该比我们链接的 glibc 早。但是内核呢?哪一个被认为包含“较新的内核功能”,例如针对内核 3.14 编译的 glibc 2.13?内核 2.6.38,因为它是在 glibc 2.13 之后发布的,还是 3.15,因为它比我们编译的内核更新?
  • 您需要检查您正在使用的特定 API。例如,epoll_ctl 中有一个众所周知的不兼容性,因此 2.6.9 之前的内核对其参数之一的处理方式不同,这一事实反映在手册页中。对于大多数程序来说,没有什么可担心的,因为大多数 Linux API 在过去 10 年中都相当稳定(除了 udev 和图形相关的东西)。
  • 谢谢,还有一个小说明:我可以在 glibc 2.13 中使用哪些内核功能?它是否取决于我构建 glibc 的内核头文件版本?
  • 这样不行。回到 epoll 示例:手册页显示“在 2.3.2 版本中添加了对 glibc 的支持”。因此,如果您有一个较旧的 glibc,则意味着您不会获得必要的包含文件和库包装器。所有其他重要的东西也是如此。
  • 谢谢。所以用新的内核头文件编译旧的 glibc 实际上是没有意义的(但也没有坏处),对吧?
猜你喜欢
  • 1970-01-01
  • 2010-09-16
  • 2012-06-21
  • 2013-08-09
  • 2019-08-19
  • 1970-01-01
  • 2023-03-27
  • 2017-06-13
  • 2019-08-27
相关资源
最近更新 更多