一、背景 openEuler master 分支于8月7日晚间上线 SWIG 4.5 后,SWIG 不再生成 Python 2 C-API 兼容宏(PyInt_*/PyString_* 等),而部分包的 python 绑定源码仍无条件引用这些符号,导致在 python3 下构建时报 "undefined symbols",对应 module 无法在运行时正常引入。本次共修复 Everything 工程八个受影响包,均已在src-openeuler 提交合并请求,详情如下。 二、修复清单(含 MR 链接与所属 SIG) 说明:标注 ⚠️ 的为 AI 自研补丁(上游/Fedora 无对应修复可参考), 请重点关注符号替换语义;未标注的为对齐上游/Fedora 官方修复的 backport。 1. ⚠️ libnl3(SIG: Networking) MR: https://atomgit.com/src-openeuler/libnl3/merge_requests/66 capi.i / genl/capi.i:PyInt_Check/AsLong/FromLong 替换为 PyLong_*, PyString_Check/AsString 替换为 PyBytes_*(nla 属性数据为二进制)。 2. libselinux(SIG: sig-security-facility) MR: https://atomgit.com/src-openeuler/libselinux/merge_requests/110 backport 上游 commit fb518ff:selinuxswig_python.i 中 PyString_FromString 替换为 PyUnicode_FromString(文本语义)。 3. ⚠️ M2Crypto(SIG: Runtime) MR: https://atomgit.com/src-openeuler/M2Crypto/merge_requests/20 _ec.i/_lib.i/_rsa.i:PyString_FromString 替换为 PyUnicode_FromString, PyInt_AsLong/PyInt_FromLong 替换为 PyLong_*。 已与 0.48.0 版本升级合并为单个 commit。 4. openscap(SIG: Programming-language) MR: https://atomgit.com/src-openeuler/openscap/merge_requests/33 swig/openscap.i:time_t typemap 与回调的 PyInt_Check/PyInt_AsLong 替换为 PyLong_*,char** 输入与结果转换的 PyString_AsString 替换为 PyBytes_AsString。与上游 PR #2391(Fedora backport)对齐; 5. openwsman(SIG: System-tool) MR: https://atomgit.com/src-openeuler/openwsman/merge_requests/27 openwsman.i / plugin.i 的 Target_* 宏、helpers.h、target_python.c 共 4 个文件 19 处:PyInt_*→PyLong_*、PyString_FromString→ PyUnicode_FromString、PyString_Check/AsString→PyBytes_Check/AsString。 与 Fedora openwsman-swig45.patch 对齐。 6. ⚠️ trace-cmd(SIG: Programming-language) MR: https://atomgit.com/src-openeuler/trace-cmd/merge_requests/87 python/ctracecmd.i:PyInt_Check 替换为 PyLong_Check(一处)。 7. unbound(SIG: Networking) MR: https://atomgit.com/src-openeuler/unbound/merge_requests/242 pythonmod/interface.i(14 处)与 pythonmod.c(4 处): PyString_FromString→PyUnicode_FromString、PyInt_FromLong/AsLong→ PyLong_FromLong/AsLong、PyString_Check/AsString→PyBytes_Check/AsString。 与上游 commit 93a5620(Fix #1489)对齐。 8. ⚠️ OpenIPMI(SIG: Networking) MR: https://atomgit.com/src-openeuler/OpenIPMI/merge_requests/48 swig/python/OpenIPMI_lang.i:16 处无条件 py2 调用(PyInt_Check×3、 PyInt_AsLong×2、PyInt_FromLong×7、PyString_FromString×4)替换为 PyLong_*/PyUnicode_FromString(IPMI 名称/值为文本数据)。条件编译 宏已正确,未改动。 三、AI 辅助修复处理过程说明 - 替换语义:PyString_* 的去向取决于数据性质——文本数据用 PyUnicode_*,二进制数据用 PyBytes_*。 - 对齐原则:上游或 Fedora 已有官方修复的逐字对齐(libselinux、 openscap、openwsman、unbound);上游未修复的自研补丁 (⚠️ libnl3、M2Crypto、trace-cmd、OpenIPMI)建议重点关注。 - 所有补丁均已在对应版本源码干净树验证可应用(dry-run + 实打 + 无 py2 符号残留)。 四、其他良性告警(无需处理) audit、lasso、libcap-ng、libnvme、libpfm、libsemanage、libsolv、marisa、 qpid-proton(cproton_ffi)、setools、subversion、tbb 共 12 类包的 undefined symbols 告警,经核查均为 python3.11 正常导出的标准 C-API, 或属跨模块运行时解析符号(如 subversion 的 SWIG 共享运行时),是 brp-check-elf-files 的例行扫描输出,不影响运行。 EPOL 仓库中的各软件,请 maintainer 或 commiter 积极与上游联系评估修复。 python modules 的符号缺失是普遍现象,无法在构建过程中拦截, 只能于运行时发现,隐藏较深。