本文介绍GCC/Glibc组件的兼容性情况。从GCC 8到GCC10版本、Glibc 2.28到Glibc 2.32版本的重要变更,以及这些变更产生的前向或后向兼容性影响,同时也提出了相应的解决方案。
背景信息
GCC/Glibc
组件的兼容性可分为ABI(Application Binary Interface)兼容性和API(Application Programming Interface)兼容性。对于GCC/Glibc
的ABI兼容性,主要指影响二进制直接运行的兼容性;而对于GCC/Glibc
的API兼容性,则主要指影响应用程序代码编译的兼容性。
GCC/Glibc的ABI兼容性
GCC
是一个编译器,通常不涉及“ABI 兼容性”的概念。然而,由于Alibaba Cloud Linux及CentOS等操作系统发行版会在GCC
软件包中搭载标准的C++
库(libstdc++
),因此GCC
对应用ABI兼容性的影响,通常是指libstdc++
库对应用ABI兼容性的影响。
前向兼容性:
libstdc++
和Glibc
都有良好的前向兼容性,因此基于CentOS 8的GCC 8
和Glibc 2.28
编译的组件,大部分可以直接在Alibaba Cloud Linux 3的GCC 10
和Glibc 2.32
环境中运行。后向兼容性:
libstdc++
和Glibc
都无法后向兼容,因此基于Alibaba Cloud Linux 3的GCC 10
和Glibc 2.32
编译的组件无法直接在CentOS 8的GCC 8
和Glibc 2.28
环境中运行。
GCC/Glibc的API兼容性
GCC
和Glibc
作为操作系统的核心工具链,对应用API有着良好的前后向兼容。然而,在版本更新的过程中,也会出现影响应用API兼容性的变更。
GCC
影响前向兼容性的示例:低版本的
GCC
编译参数在高版本中被废弃,使用了相同编译参数的应用程序无法在高版本的GCC
环境中编译通过,需要手动修改编译参数。影响后向兼容性的示例:高版本的
GCC
引入新的编译参数,使用了该参数的应用程序无法直接在低版本的GCC
环境中编译通过,需要手动修改编译参数。
Glibc
影响前向兼容性的示例:低版本的
Glibc
函数或头文件在高版本中被废弃,使用了该函数或头文件的应用程序无法在高版本的Glibc
环境中编译通过,需要手动修改应用程序代码。影响后向兼容性的示例:高版本的
Glibc
引入了新的函数及实现,使用了该函数的应用程序无法直接在低版本的Glibc
环境中编译通过,需要手动修改应用程序代码。
Glibc 2.32版本的重要变更及影响
下表列出了Glibc 2.28
到Glibc 2.32
版本的重要变更,并介绍了这些变更所带来的影响以及相应的解决方案。
类别 | 变更 | 兼容性变更类型 | 影响 | 解决方案 |
|
| API | 如果源码使用了 | 使用 |
废弃了 | API | 如果源码使用了 | 使用 | |
| API |
| 使用 | |
| API |
| 使用 | |
| API | 在 | 添加 | |
| 删除了头文件 | API | 引用了该头文件的代码会编译失败。 | 删除代码中对 |
删除了 | API | 调用 | 使用 | |
| 从头文件中删除了 | ABI | 基于旧版本 | 内核和 |
API | 对于新编译的应用程序,会直接编译失败。 | |||
| 传统的信号处理函数 | ABI | 对于已编译的二进制, | 无需解决方案。 |
API | 对于应用程序代码,编译会出现 | 修改源码,使用 | ||
| ABI | 对于已编译的二进制, | 无需解决方案。 | |
API | 对于应用程序代码,编译会出现 | 修改源码,使用 | ||
|
| ABI | 对于已编译的二进制, | 无需解决方案。 |
API | 对于应用程序代码,编译会出现 | 使用 | ||
| 删除了 | API | 应用程序调用 | 如果内核不支持 |
| 新增 | API | 如果使用了弱引用 | 对于单线程的判断使用 |
| 去除对 | API | 所有引用了 |
|
GCC 10版本的重要变更及影响
下表列出了GCC 8
到GCC 10
版本的重要变更,并介绍了这些变更所带来的影响以及相应的解决方案。
类别 | 变更 | 兼容性变更类型 | 影响 | 解决方案 |
|
| API |
这些变量会在链接阶段合并放入到 |
|
| 形参和实参不匹配时, | API | 形参和实参不匹配时,编译出现报错。 |
|
| 一些 | API | 应用程序编译报错。 | 根据报错信息,在程序中引入相关的头文件。 |
枚举检查 |
| API | 应用程序编译报错。 | 正确使用枚举。 |
LSE |
| API | 该选项能够在运行时检测是 | 正确使用该选项。 |
GCC 10告警信息变更说明
下表列出了GCC 8
到GCC 10
版本相关的告警信息变更。
编译告警并不会直接影响API的兼容性。在应用程序迁移到Alibaba Cloud Linux 3系统时,如果出现编译告警,建议修改应用程序代码以规避这些告警信息。
参数名 | 兼容性变更类型 | 类型 | 说明 |
| API | 新增 | 默认为 当结构体或者 |
| API | 新增 | 由 |
| API | 增强 | 检测更多的数据元素访问越界和对长度为0的数组元素访问。 |
| API | 增强 | 检测它们之间的类型、别名、声明与其目标之间的属性是否匹配。 |
| API | 增强 | 编译时检查使用格式化输出函数是否有可能发生缓冲区溢出。预测到输出将超过缓冲区界限时,编译器就会发出警告。 |
| API | 新增 | 检测别名和弱引用声明中的函数属性是否丢失。 |
| API | 增强 | 与 |
| API | 增强 |
|
| API | 增强 | 检测更多返回自动变量地址的场景。 |
| API | 增强 | 检测对动态分配对象的重叠访问。 |
| API | 增强 |
|
相关文档
了解更多版本变更信息,请参考Glibc
和GCC
的ReleaseNotes。