glibc 2.44 — openEuler 2509 RPM 打包工程

举报
山涧烟雨村 发表于 2026/08/23 19:37:22 2026/08/23
【摘要】 glibc 2.44 — openEuler 2509 RPM 打包工程 项目简介本仓库为在 openEuler 2509 系统中以 RPM 方式打包构建 glibc-2.44 的工程文件。项目由原 glibc-2.38 补丁集仓库经过架构过滤、补丁适用性审计、spec 适配后升级而来,最终保留 4 个可应用于 glibc-2.44 的厂商定制/兼容性补丁。 仓库结构glibc.spec ...

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.patchprefer_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 文件与辅助配置

补丁适用性审计方法

  1. 解包 glibc-2.44.tar.gz 得到纯净源码树
  2. 按 spec 中 Patch 声明顺序,逐一对每个补丁执行 git apply --check -p1(可应用则 git apply 继续),模拟 %autosetup 行为
  3. 对失败补丁在纯净树复检,排除"前序补丁导致的时序冲突"误判
  4. 对文本可应用的补丁再做源码对照:确认改动未被 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 提供版本控制信息)

备注

  • 源码包不纳入 gitglibc-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 阶段失败,两次失败原因不同:

  1. -k 中止:math/elf 子目录测试失败(openEuler 24.03 环境相关,本地 25.09 全部通过)导致 make check 中止 → 顶层 tests.sum 未生成 → test -s tests.sumset -e 下失败 → %check 退出
  2. Summary 检查误判:加 -k 后子目录测试失败时顶层 tests target not remadetests.sum 与 Summary 行均不生成 → 原 Summary 检查将测试失败误判为"测试套件构建失败"→ exit 1

修复(两个提交):

提交 内容
e5dfc32 make check-k(子目录测试失败不再中止顶层合并);test -s tests.sum 容忍缺失
3f0dd3b %check 重排中止逻辑:先汇总非通过项(tests.sum 缺失时回退到各子目录 subdir-tests.sum),仅当"无失败项可汇总 且 无 Summary 行"(测试套件整体未运行/构建失败)才判为致命

验证rpmspec -P 解析、%checkbash -n、三场景逻辑模拟(EulerMaker 实况不中止 / 全部通过不中止 / 真构建失败仍致命)均通过。

结果:EulerMaker 平台 rpmbuild 构建 RPM 成功(2026-08-22)。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。