Red Hat(及其工程师在 GCC 上游的大量贡献)通过软件集合(Software Collections / SCL) + 深度定制构建 + 选择性静态链接实现了“时空截断”。
核心技术机制
并行安装,不污染系统:
Toolset 安装到 /opt/rh/gcc-toolset-15/ 等独立目录。
使用 scl enable gcc-toolset-15 bash 启动一个子 shell,修改 PATH、LD_LIBRARY_PATH 等环境变量,让新工具优先。
系统默认 GCC 8 完全不受影响。
编译器本身能在老 glibc 2.28 上运行:
Red Hat 工程师对 GCC 15 源码打大量下游 patch,调整 bootstrap 过程和依赖。
工具链(包括 binutils、gdb 等)构建时针对 RHEL 8 的宿主环境优化,确保 GCC 15 可执行文件本身不引入过新 glibc 符号。
生成二进制的向下兼容(最关键的黑科技):
符号版本控制 + Linker Scripts:gcc-toolset 的 libstdc++.so 等往往是 linker script(脚本),它引导链接器:
优先使用系统老 glibc / libstdc++ 的符号(GLIBC_2.28 等)。
只引入老版本已有的 ABI。
选择性静态链接新特性:较新的 C++ 标准库实现(某些容器、算法、异常处理增强等)被静态嵌入到最终二进制中(通过 -lstdc++_nonshared 等机制)。这样:
程序能享受 C++23/C++26 新语言特性。
运行时不依赖新共享库,只依赖老 glibc 符号。
Red Hat 官方文档明确说明:这会引入轻微额外安全风险(静态代码不随系统 errata 自动更新),但 Red Hat 会通过安全公告提醒用户重建。强烈建议不要全静态链接整个应用。
其他工程细节:
annobin / 安全强化:集成构建时安全检查。
多版本共存:RHEL 8 上可同时安装多个 gcc-toolset(如 13、14、15)。
兼容性保证:生成的二进制遵循 Red Hat Application Compatibility Guidelines,能在 RHEL 8 及兼容系统上可靠运行。
与原生上游 GCC 的区别:上游 GCC 15 直接构建时,很容易在头文件/库链接阶段拉入新 glibc 符号(例如新版本的 memcpy、pthread 等),导致二进制在 glibc 2.28 上报 GLIBC_xxx not found。Red Hat 把这个“痛苦的向下兼容工程”变成了开箱即用的产品。
【 在 z16166 的大作中提到: 】
: AI的语料太旧了
: redhat的gcc toolset最新正式版已经是15了,它的语料里还是12
: 我之前的编译方案是AI按旧语料搞的(它可能不知道github最近两年有提供arm的原生runner),“容器外编译vcpkg,容器内再搞交叉编译”,到最后编译一次要四五十分钟。
: ...................
--
FROM 113.132.8.*