资讯详情

资讯详情

CloverBootloader 中修改 OpenSSL 源码的完整指南:从新增 API 到 make update 与 doc-nits 校验

固件操作系统【免费下载链接】CloverBootloaderBootloader for macOS, Windows and Linux in UEFI and in legacy mode项目地址https://gitcode.com/gh_mirrors/cl/CloverBootloader点击查看免费下载本文以 OpenSSL 官方开发文档 HACKING.md 为主线结合 CloverBootloader 仓库中实际集成的 OpenSSL 3.0.9 源码树Library/OpensslLib/openssl系统讲解如何在定制化 OpenSSL 构建中安全地新增公开函数、正确执行make update生成序号与错误码文件、通过make doc-nits保证文档格式以及处理合并冲突的策略。读完本文你将掌握一套可复制的改 OpenSSL → 回归验证 → 规范化提交的完整开发流程并能理解其背后的构建系统原理。一、背景CloverBootloader 中的 OpenSSL 定制构建CloverBootloader 作为支持 macOS、Windows、Linux 多系统引导的 UEFI Bootloader其固件侧的加密能力如安全启动、镜像签名校验、TLS 等依赖 EDKII 环境下的 OpenSSL 库。仓库中 OpenSSL-HOWTO.txt 明确指出EDKII 支持与最新发布的 OpenSSL 版本构建OpenSSL 仓库以子模块形式加入项目其构建产物libcrypto、libssl通过 configure.py 脚本将 OpenSSL 的Configure输出处理成本地的 OpensslLib.inf 与 OpensslLibCrypto.inf供 UEFI 固件链接使用。当前仓库内置的 OpenSSL 源码版本可通过 VERSION.dat 确认MAJOR3、MINOR0、PATCH9即 OpenSSL 3.0.9发布于 2023 年 5 月 30 日。也就是说本文描述的工作流适用对象是这份 3.0.x 源码树而非更早的 1.1.x 系列不同大版本的make update行为与生成文件格式会有所差异请在动手前先核对 VERSION.dat。在这类定制化构建场景下往往需要为固件补齐 OpenSSL 上游未暴露的接口或修改内部实现以适配 UEFI 环境。官方 HACKING.md 给出的正是这一过程的官方姿势。二、新增公开函数的三种声明方式按照 HACKING.md 的说明当你为定制构建新增公开函数时必须确保编译器能看见该函数否则后续make update无法将其纳入导出表。有两种合法路径在既有 OpenSSL 头文件中添加原型将新函数原型追加到某个已有的公开头文件例如include/openssl/*.h这是最小改动方式新建独立头文件并让构建系统拾取提供一个新的头文件后需要编辑 Configurations/unix-Makefile.tmpl把该文件加入构建的依赖清单使其随构建生成并被安装/引用。其中第 2 种方式涉及对 Unix 构建模板的直接修改。从该模板源码可以看到unix-Makefile.tmpl模板中维护了多组头文件清单如sslheaders_tmpl、cryptoheaders_tmpl位于 unix-Makefile.tmpl 第 1251 行起新增头文件时需在对应清单中登记构建才会将其纳入生成与分发流程。需要说明的是这份模板是配置生成 Makefile 的元模板直接改动后通常还需重新运行Configure才会生效。三、核心工作流五步完成定制并验证HACKING.md 给出了一套严谨的开发闭环建议严格按序执行./Configure -Werror --strict-warnings [your-options] make update make make test make doc-nits # 仅在准备向上游提交时必需各步骤的职责如下命令作用是否必须./Configure -Werror --strict-warnings [your-options]以警告即错误的严格模式配置构建提前暴露新增代码的编译告警必须make update重新生成函数序号ordinals、错误码文件、OID 相关文件与 buildinfo必须make增量编译全部库与工具必须make test运行完整测试套件验证新函数未破坏既有功能必须make doc-nits校验 man 文档pod 文件格式是否合规仅提交上游时3.1 严格模式配置-Werror --strict-warnings-Werror将告警升级为错误--strict-warnings进一步启用 OpenSSL 的完整告警集合。这不仅是 OpenSSL 的代码质量标准——CONTRIBUTING.md 同样要求补丁应遵循编码风格且无警告编译在可用gcc/clang的环境下应使用--strict-warnings的Configure选项。[your-options]代表你为当前平台传入的附加配置项例如 EDKII 环境下的no-asm、no-shared、no-tests等请以仓库实际构建配置为准。3.2make update到底做了什么很多人把make update简单理解为刷新导出表实际上它是多条生成目标的聚合。查看 unix-Makefile.tmpl 中的定义# Its important that generate_buildinfo comes after ordinals, as ordinals # is sensitive to build.info changes. update: generate errors ordinals generate_buildinfo即make updategenerateerrorsordinalsgenerate_buildinfo。其中generateunix-Makefile.tmpl 第 1108-1109 行继续展开为generate_apps、generate_crypto_bn、generate_crypto_objects、generate_crypto_conf、generate_crypto_asn1、generate_fuzz_oids等子目标ordinals读取 util/libcrypto.num、util/libssl.num以及 util/engines.num、util/providers.num等序号文件依据头文件中的新原型自动追加新函数的序号条目底层逻辑由 util/mkdef.pl 与 util/mknum.pl 实现errorsunix-Makefile.tmpl 第 1239 行起调用util/ck_errf.pl -strict -internal检查错误码宏再由util/mkerr.pl重新生成各模块的*_err.c错误码文件generate_buildinfo经generate_doc_buildinfo生成文档构建信息。序号文件.num的格式与作用以 util/libcrypto.num 为例每一行代表一个导出符号的序号记录EVP_DigestInit_ex 31 3_0_0 EXIST::FUNCTION: PEM_read_bio_PUBKEY 39 3_0_0 EXIST::FUNCTION: d2i_EC_PUBKEY 1 3_0_0 EXIST::FUNCTION:DEPRECATEDIN_3_0,EC其字段依次为符号名、序号ordinal、引入版本如3_0_0、条件标记EXIST/FUNCTION 及其依赖宏如DEPRECATEDIN_3_0,EC。make update扫描头文件后会为新函数分配新的序号并写入对应.num文件从而保证libcrypto/libssl的 ABI 导出顺序稳定、可追踪。该文件当前共 5431 行是导出表的核心证据。OID 与错误码文件的再生成HACKING.md 特别提醒make update同时会重新生成 crypto/objects/ 目录下的 OID 相关文件以及错误码文件。从generate_crypto_objects目标unix-Makefile.tmpl 第 1140-1157 行可以看到完整链条由 crypto/objects/objects.txt 与obj_mac.num经objects.pl生成obj_mac.h与obj_mac.num由obj_mac.h经obj_dat.pl生成obj_dat.hNID/SN/LN 的查找表由obj_mac.num与obj_xref.txt经objxref.pl生成obj_xref.h。也就是说如果你新增了 OID 定义这些生成文件都会在make update时被刷新不应手工编辑。3.3make与make testmake执行增量编译将新函数编译进libcrypto/libsslmake test则运行完整测试套件。虽然 HACKING.md 未展开说明但 CONTRIBUTING.md 明确要求补丁应尽可能包含测试可追加到既有测试或新增测试测试框架说明见 test/README.md。对于仅做本地定制而非上游提交的场景make test是确认改动不破坏既有行为的最低成本手段。四、准备向上游提交时的规范化make doc-nits如果你计划把改动回馈 OpenSSL 上游提交规范见 CONTRIBUTING.md则必须在make update之后运行make doc-nitsHACKING.md 的解释是该命令用于确保文档格式正确。从 unix-Makefile.tmpl 的实现看它内部会先build_generated_pods生成文档再调用util/find-doc-nits -c -n -l -eunix-Makefile.tmpl 第 1113-1115 行做多维度检查-c交叉引用、-n命名、-l链接、-e其他错误。OpenSSL 的公开 API 文档使用 pod 格式编写存放于doc/man[1357]目录任何新增或变更的功能都应补充对应 pod 文档再以make doc-nits验证。五、生成文件冲突的官方处理策略这是 HACKING.md 中最实用的运维经验如果合并rebase/merge时在这些生成文件上发生冲突直接删掉冲突的生成文件再运行make update重新生成即可不要手工去解冲突——因为这些文件本来就是机器生成的手工修改既无意义也易出错。配合这一策略官方给出的建议是将生成文件单独提交commit separately。这样在合并冲突时可以删得干净、再生得快避免混在普通源码提交中难以剥离。具体到本仓库需要单独提交/可安全再生的生成文件至少包括序号文件util/libcrypto.num、util/libssl.num、util/engines.num、util/providers.numOID 生成文件crypto/objects/obj_mac.num、obj_mac.h、obj_dat.h、obj_xref.h均在 crypto/objects/ 与include/openssl/下错误码文件各模块由mkerr.pl生成的*_err.c。六、EDKII/UEFI 集成下的额外注意事项本文工作流在纯 Unix 桌面环境下运行而在 CloverBootloader 的 EDKII 集成场景下还需注意两点.inf清单与源码树同步OpenSSL 源码被固件构建消费时是通过 OpensslLib.inf 等 INF 文件列举源文件实现的。新增源码文件后需要由维护者重新运行 configure.py它执行 OpenSSL 的Configure再将结果处理成本地.inf如 OpenSSL-HOWTO.txt 所述这一步骤只在升级 OpenSSL 版本或改变构建选项时由维护者执行一次普通用户无需重复操作生成文件版本对齐在 EDKII 环境中重跑make update可能会改变.num序号与生成头文件需确保其与仓库中已提交的 OpensslLib.inf 清单保持同一版本基线避免 UEFI 链接时符号缺失。七、完整实操清单速查综合 HACKING.md 与源码证据一次完整的 OpenSSL 定制开发应依次完成在既有头文件添加原型或新建头文件并在 Configurations/unix-Makefile.tmpl 登记./Configure -Werror --strict-warnings [your-options]严格配置make update生成序号、错误码与 OID 文件make编译make test回归验证若提交上游为新增 API 编写 pod 文档并运行make doc-nits校验将生成文件单独提交便于日后冲突时删除并重新生成。这套流程的核心价值在于把改代码和改生成文件彻底分离——你只负责头文件原型与实现其余导出表、错误码、OID 表全部交给make update自动化完成再以make test与make doc-nits兜底质量这正是 OpenSSL 官方维护者与下游集成者共同遵循的规范路径。赞分享固件操作系统【免费下载链接】CloverBootloaderBootloader for macOS, Windows and Linux in UEFI and in legacy mode项目地址https://gitcode.com/gh_mirrors/cl/CloverBootloader点击查看免费下载相关推荐OpenSSL 公共函数与宏文档化指南从 make doc-nits 报错到 .pod 文档落地的完整流程OpenSSL 公共函数与宏文档化指南从 make doc nits 报错到 .pod 文档落地的完整流程 导读 本文基于 OpenSSL 官方 HOWTO密码学网络安全通信OpenSSL 文档政策全解析从 DOCUMENTATION.md 到 doc-nits 的工程化文档规范OpenSSL 文档政策全解析从 DOCUMENTATION.md 到 doc nits 的工程化文档规范 导读 本文以 OpenSSL 仓库根目录的 DOC密码学网络安全通信Gitea 源码开发工作流从 make build 到 Swagger 校验的完整构建与调试指南Gitea 源码开发工作流从 make build 到 Swagger 校验的完整构建与调试指南 Gitea 采用前后端分离的构建体系Go 编写后端、Typ后端代码托管研发协作CI/CD上一篇Unity与Mapbox无缝集成实现动态地图缩放与视角切换的技巧下一篇SynCamMaster常见问题解答从安装到生成的全方位解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →