我盯着以下的输出:
% file -b /lib/x86_64-linux-gnu/*.so | grep ", for" | colrm 1 130 | sort -u
=5018237bbf012b4094027fd0b96fc22a24496ea4, for GNU/Linux 3.2.0, not stripped
9f21d, for GNU/Linux 3.2.0, stripped
bee51, for GNU/Linux 3.2.0, stripped
, for GNU/Linux 3.2.0, stripped
sha1]=2e5abcee94f3bcbed7bba094f341070a2585a2ba, for GNU/Linux 3.2.0, stripped
GNU/Linux 3.2.0 有什么特别之处?这是在 Debian/bullseye 系统 (amd64) 上。
换句话说:GNU/Linux 3.2.0 中引入了哪些 API/功能(线程模型、安全功能...)如此重要?所需版本的显式设置将阻止用户使用某些LD_ASSUME_KERNEL
值,因此我猜测有充分的理由拒绝旧值,例如LD_ASSUME_KERNEL=2.4.19
(例如)。
答案1
过去,GNU C 库定期更新其最低内核版本,这通常允许进行一些简化。 C 库包含大量代码来处理内核版本之间的差异,例如,在可能的情况下优先使用新的系统调用。提高最低内核版本意味着可以删除处理旧版本的代码。
3.2.0 的唯一意义在于它是 GNU C 库经历此过程的最后一个内核版本。它是由约瑟夫·迈尔斯发起的2016年1月,当 2.6.32(之前的最低内核版本)达到其生命周期时。 3.2 是当时最古老的受支持内核。
碰撞本身是在两次提交中实现的,2016 年 2 月首次针对所有非 x86 架构, 和然后是 2017 年 5 月的 x86 架构。 (延迟与 OpenVZ 支持问题有关。)例如,还有许多其他后续补丁来删除不再需要的代码或简化代码这种简化recvmmsg
。
这并不意味着 GNU C 库不支持自 3.2.0 以来添加到 Linux 内核的功能;确实如此,但以多种方式。支持某些功能作为改进(例如 clone3
),其他的只需提供(例如 close_range
),其他的可通过兼容性回退(IE如果系统调用不可用,则新系统调用完成的工作将由库完成)。
您还可以使用配置选项构建符合给定内核版本要求的 C 库--enable-kernel
。