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),仅供参考

相关新闻

NeoProgrammer:嵌入式固件原子化烧录与CI/CD交付中枢

NeoProgrammer:嵌入式固件原子化烧录与CI/CD交付中枢

简介:NeoProgrammer编程器是一套基于CH341A芯片的通用型微控制器烧录工具资源包,面向电子工程初学者、嵌入式开发爱好者及教学实践者,解决AVR/PIC/8051等主流MCU固件烧录、SPI/I2C/NOR Flash读写、OTP安全寄存器操作等实际编程需求。资源共71…

2026/10/15 20:28:03 阅读更多 →
Olares 应用分发完整指南:从 OAC 打包到 Olares Market 上架与生命周期管理

Olares 应用分发完整指南:从 OAC 打包到 Olares Market 上架与生命周期管理

云原生后端运维 【免费下载链接】Terminus Open-Source Personal Cloud OS for Always-On Agents 项目地址: https://gitcode.com/gh_mirrors/terminus2/Terminus 点击查看 免费下载 Olares(Terminus)的应用分发体系建立在开放标准与自动化校…

2026/10/15 20:28:03 阅读更多 →
NeoProgrammer:嵌入式固件交付中枢与YAML自动化烧录框架

NeoProgrammer:嵌入式固件交付中枢与YAML自动化烧录框架

简介:NeoProgrammer编程器是一套基于CH341A芯片的通用微控制器烧录工具资源包,面向电子工程师、嵌入式初学者及硬件爱好者,解决AVR/PIC/8051等主流MCU固件烧录、SPI/I2C/NOR Flash读写与OTP安全寄存器操作等实际开发需求。资源共71个文件&…

2026/10/15 20:28:03 阅读更多 →

最新新闻

MySQL零基础入门:从安装到增删改查实战教程

MySQL零基础入门:从安装到增删改查实战教程

写这篇教程的初衷很简单——我见过太多人一上来就啃官方文档,结果被术语劝退;也见过不少人背了一堆命令,却连数据库都没装好。MySQL作为最流行的开源关系型数据库,它其实没有传说中那么难,难的是没人告诉你第一步该干嘛…

2026/10/15 21:18:29 阅读更多 →
让AI Agent写出正确代码:自我验证闭环实战指南

让AI Agent写出正确代码:自我验证闭环实战指南

过去大半年,我一直在折腾 AI Agent 写真实业务代码。最头疼的不是它写不出来,而是它写出来的东西你不敢信:代码结构完整、命名也规范、注释还齐,结果一跑测试,边界条件炸了一地。后来听到一位在开发者工具领域深耕多年…

2026/10/15 21:18:29 阅读更多 →
大麦抢票脚本怎么用:Python 自动化抢票从登录到下单的完整指南

大麦抢票脚本怎么用:Python 自动化抢票从登录到下单的完整指南

大麦抢票脚本怎么用:Python 自动化抢票从登录到下单的完整指南 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 想让热门演出大麦抢票不再拼手速,靠的不…

2026/10/15 21:18:29 阅读更多 →
LoRA:大语言模型的低秩适应

LoRA:大语言模型的低秩适应

研究问题 预训练模型通常需要下游任务数据来继续训练模型,全参数微调更新全部参数:模型越大,梯度、优化器状态和任务专属模型副本的开销越高。 问题:能否只训练少量参数,获得接近全参数微调的效果,同时减少…

2026/10/15 21:18:29 阅读更多 →
华为OD机考100题含答案:从刷题到考场稳定发挥的完整指南

华为OD机考100题含答案:从刷题到考场稳定发挥的完整指南

简介:这份华为OD机考100题(含答案)docx文档,面向具备一定编程基础、正在准备华为OD机考或同类技术认证的开发者,帮助其系统熟悉机考题型与考察重点。文档精选100道经典真题,涵盖【5键键盘的输出】【N进制减…

2026/10/15 21:18:29 阅读更多 →
参考资源章节如何从“链接堆砌”变成文档导航页

参考资源章节如何从“链接堆砌”变成文档导航页

1. 第32章参考资源放在最后,却是读者最先翻的章节做技术文档这么多年,我越来越觉得“参考资源”是被误解最深的一章。大多数人以为它就是把链接堆在结尾,让读者自己去看,但实际上它决定了一本手册、一个项目文档能不能真正被人用起…

2026/10/15 21:17:27 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →