glibc 2.44 — openEuler 2509 RPM 打包工程
glibc 2.44 — openEuler 2509 RPM 打包工程
项目简介
本仓库为在 openEuler 2509 系统中以 RPM 方式打包构建 glibc-2.44 的工程文件。
项目由原 glibc-2.38 补丁集仓库经过架构过滤、补丁适用性审计、spec 适配后升级而来,最终保留 4 个可应用于 glibc-2.44 的厂商定制/兼容性补丁。
仓库结构
glibc.spec 主打包配置(Version 2.44 / Release 1)
glibc.yaml OBS 构建配置(version_control)
glibc-2.44.tar.gz 上游源码包(本地保留,未纳入 git)
.patch × 4 厂商定制/兼容性补丁(见下)
bench.mk / glibc-bench-compare benchtests 相关(Source3/4)
LanguageList locale 语言列表(Source5,%install 使用)
nscd.conf / nsswitch.conf Source1/2,安装至 /etc
replace_same_file_to_hard_link.py Source7,locale 硬链接处理
testsuite_whitelist Source8,%check 测试白名单
.gitignore 排除 glibc-2.44.tar.gz
保留的补丁(Patch0~Patch3)
| 补丁 | 性质 | 说明 |
|---|---|---|
add-pthread_cond_clockwait-GLIBC_2_28.patch |
ABI 兼容 | 为 openEuler 2.28 时代链接的二进制提供 pthread_cond_clockwait@GLIBC_2.28 兼容符号(2.44 上游未含) |
add-Wl-z-noseparate-code-for-so.patch |
厂商性能 | x86_64 关闭 separate-code,避免 shell 类程序性能下降 8%~10%(relro-LDFLAGS 机制在 2.44 仍有效) |
AArch64-modify_the_SVE_memcpy_implementation_for_32-byte_aligned_access.patch |
鲲鹏性能 | SVE memcpy 由 16 字节对齐改为 32 字节对齐,降低跨缓存行访问与 bank 冲突 |
strcmp-delete-align-for-loop_aligned.patch |
鲲鹏性能 | 删除 strcmp loop_aligned 的 .p2align 4,修复鲲鹏 920 上 16~23 字符场景分支预测性能劣化 |
主要变更记录
1. 补丁裁剪:370 → 4
原仓库 370 个补丁,历经两轮清理:
- 架构过滤:仅保留 x86(x86_64/i386)与 arm(aarch64)相关补丁,删除 LoongArch、Sw64、S390、PowerPC、SPARC 等其他架构补丁及通用补丁(370 → 123)
- 2.44 适用性审计:将 123 个补丁按 spec 顺序对 glibc-2.44 源码逐一
git apply --check,并做纯净树复检交叉验证——- 117 个不适用(绝大多数为 2.38 时代的上游 backport,2.44 已包含)→ 删除
- 2 个经源码对照判定失效/冗余 → 删除:
AArch64-Use-prefer_sve_ifuncs-for-SVE-memset.patch:prefer_sve_ifuncs变量在 2.44 已被上游移除(memcpy.c 重构),引用会导致编译失败0002-x86-Lower-non-temporal-copy-threshold-for-Hygon.patch:Hygon 3/8 非时序拷贝阈值功能已被 2.44 上游以更优形式包含
- 最终保留 4 个可干净应用且功能仍需要的厂商定制/兼容补丁
2. spec 适配(2.38 → 2.44)
| 字段 | 原值 | 新值 |
|---|---|---|
| Version | 2.38 | 2.44 |
| Release | 120 | 1 |
| Source0 | %{name}-%{version}.tar.xz |
.tar.gz(2.44 发布格式) |
| gcc 要求 | >= 7.2.1-6 | >= 12.1(对齐 2.44 INSTALL) |
| binutils 要求 | >= 2.30-17 | >= 2.39(对齐 2.44 INSTALL) |
| Patch 声明 | 123 条 | 4 条(Patch0~Patch3) |
| %changelog | 2.28~2.38 历史条目 | 清空并新增 2.44-1 条目 |
%autosetup -n %{name}-%{version} -p1 随 Version 自动适配解包目录。
3. 文件清理
- 删除:其他架构补丁、通用补丁、不适用/失效补丁(共 366 个)、旧源码包
glibc-2.38.tar.xz、未使用的LicenseList(Source6 声明但从未引用) - 保留:全部被 spec 引用的 Source 文件与辅助配置
补丁适用性审计方法
- 解包
glibc-2.44.tar.gz得到纯净源码树 - 按 spec 中 Patch 声明顺序,逐一对每个补丁执行
git apply --check -p1(可应用则git apply继续),模拟%autosetup行为 - 对失败补丁在纯净树复检,排除"前序补丁导致的时序冲突"误判
- 对文本可应用的补丁再做源码对照:确认改动未被 2.44 上游包含、引用的变量/宏仍存在、构建机制(如
relro-LDFLAGS)仍生效
构建方法(openEuler 2509)
# 1. 安装构建依赖
dnf install -y gcc gcc-c++ binutils make >= 4.0 bison >= 2.7 gawk gettext \
texinfo audit-libs-devel libcap-devel procps-ng util-linux \
systemtap-sdt-devel systemd python3 m4 chrpath libselinux-devel \
elfutils libidn2 gd-devel libpng-devel zlib-devel kernel-headers
# 2. 准备源码包(Source0 由 URL 下载,或使用本地 glibc-2.44.tar.gz)
curl -O https://ftp.gnu.org/gnu/glibc/glibc-2.44.tar.gz
# 3. 本地构建
rpmbuild -ba glibc.spec
# 4. 或通过 OBS 构建(glibc.yaml 提供版本控制信息)
备注
- 源码包不纳入 git:
glibc-2.44.tar.gz(约 39 MiB)超过 gitcode 单文件 10 MiB 限制,且远端项目未启用 Git LFS(project lfs not enabled),故保留本地、由.gitignore排除,构建时由 Source0 URL 下载 - 本地已安装 git-lfs(3.6.1),若日后在 gitcode 启用 LFS,可将源码包迁移为 LFS 跟踪
- 补丁适用性审计为静态验证(
git apply --check+ 源码对照);已在 openEuler 25.09 本机完成一次完整rpmbuild构建验证(见下节)
本机 RPM 构建验证(2026-08-22)
在 openEuler 25.09 本机成功完成 glibc-2.44 的 RPM 构建。
构建环境:gcc 12.3.1、binutils 2.41、make 4.4.1、python 3.11.13,均满足 2.44 INSTALL 工具链要求。
构建命令(4 核限制避免主机过载,跳过测试套件):
rpmbuild -ba --without testsuite --define "_smp_mflags -j4" SPECS/glibc.spec
构建中修复的错误:
| 错误 | 原因 | 修复 |
|---|---|---|
cannot open file '/rpmbuild/SOURCES/LanguageList' |
systemd-run 服务环境缺 HOME,%{_topdir} 解析成 /rpmbuild |
启动时注入 --setenv=HOME=/root |
RPM build errors: 没有找到文件:.../COPYING |
glibc-2.44 上游已移除顶层 COPYING 文件 |
%license 移除 COPYING 引用,保留 COPYING.LIB LICENSES |
brp 阶段的
find/grep/xargs symbol lookup error(系统工具加载构建树内新 libc)为非致命警告,不影响产物。
构建产物(15 个):14 个二进制 RPM + 1 个 SRPM
- 二进制:glibc、glibc-common、glibc-devel、glibc-all-langpacks、glibc-locale-archive、glibc-locale-source、glibc-help、nscd、libnsl、nss_modules、glibc-nss-devel、glibc-debugutils、glibc-debuginfo、glibc-debugsource
- 源码:
SRPMS/glibc-2.44-1.src.rpm
验证:主包元数据 glibc-2.44-1.x86_64 正确;/lib64/libc.so.6、/lib64/ld-linux-x86-64.so.2、/lib64/libm.so.6 均在包内;产物清单与构建日志"已写至"完全一致。
EulerMaker(openEuler 2403)构建问题修复(2026-08-22)
在 EulerMaker 平台使用 openEuler 2403 构建时,%install 阶段报 rpath 检查错误:
ERROR 0020: file '/usr/lib64/gconv/IBM1162.so' contains a rpath referencing '..' of an absolute path [/usr/lib/gcc/x86_64-openEuler-linux/12/../../../../lib64/]
根因:glibc-2.44 链接 gconv 模块与 sotruss-lib.so 等共享库时注入 -Wl,-rpath,其中包含 gcc 默认库路径(/usr/lib/gcc/.../12/../../../../lib64/,含 .. 非规范路径);openEuler 2403 的 brp rpath 检查(ERROR 0020)拒绝此类路径导致 %install 失败。spec 原有 removeLoadPath() 仅匹配 $ORIGIN 开头的 rpath(为 2.38 时代设计),未覆盖 gcc 路径 rpath。本地 25.09 构建不受影响(其 rpath 检查不致命)。
修复(提交 7f07460):
| 改动 | 说明 |
|---|---|
removeLoadPath() 条件 |
由仅匹配 $ORIGIN 扩展为清除任意 RPATH/RUNPATH($ORIGIN 情况保留 findReliantLib 软链逻辑) |
| 清理范围 | 由仅 gconv/ 子目录扩大至整个 %{_libdir}(覆盖 audit/sotruss-lib.so) |
验证:本地重建后检查新包——253 个 gconv 模块及全部 277 个真实 ELF 文件均无 rpath;构建产物完整(15 个)。
EulerMaker %check 修复与构建成功(2026-08-22)
问题:EulerMaker(openeuler:24.03-lts-sp4-amd64)构建在 %check 阶段失败,两次失败原因不同:
- 无
-k中止:math/elf 子目录测试失败(openEuler 24.03 环境相关,本地 25.09 全部通过)导致make check中止 → 顶层tests.sum未生成 →test -s tests.sum在set -e下失败 →%check退出 - Summary 检查误判:加
-k后子目录测试失败时顶层teststargetnot remade→tests.sum与 Summary 行均不生成 → 原 Summary 检查将测试失败误判为"测试套件构建失败"→exit 1
修复(两个提交):
| 提交 | 内容 |
|---|---|
e5dfc32 |
make check 加 -k(子目录测试失败不再中止顶层合并);test -s tests.sum 容忍缺失 |
3f0dd3b |
%check 重排中止逻辑:先汇总非通过项(tests.sum 缺失时回退到各子目录 subdir-tests.sum),仅当"无失败项可汇总 且 无 Summary 行"(测试套件整体未运行/构建失败)才判为致命 |
验证:rpmspec -P 解析、%check 段 bash -n、三场景逻辑模拟(EulerMaker 实况不中止 / 全部通过不中止 / 真构建失败仍致命)均通过。
结果:EulerMaker 平台 rpmbuild 构建 RPM 成功(2026-08-22)。
- 点赞
- 收藏
- 关注作者
评论(0)