ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenSSL 在 DJGPP(DOS)平台上的移植与编译指南

OpenSSL 在 DJGPP(DOS)平台上的移植与编译指南 OpenSSL 在 DJGPPDOS平台上的移植与编译指南【免费下载链接】opensslGeneral purpose TLS and crypto library项目地址: https://gitcode.com/GitHub_Trending/ope/opensslOpenSSL 官方在 NOTES-DJGPP.md 中记录了针对 DJGPP 平台的移植与构建说明。DJGPP 是一套运行于 16 位 DOS 之上的 32 位 Unix 风格运行时环境本文以该文档为主体结合仓库中 Configurations/50-djgpp.conf 等构建配置与源码实现系统讲解 DJGPP 平台的构建目标定义、环境准备、配置编译命令、运行时随机数注意事项。读完本文你将能够在一套完整的 DJGPP 环境下独立完成 OpenSSL 的 Configure 与 make并理解该移植版本在随机数种子方面的特殊处理。DJGPP 平台与 OpenSSL 移植背景DJGPP 是Unix look-alike的 32 位运行时环境运行在 16 位 DOS 之上由 DJ Delorie 维护。OpenSSL 对 DJGPP 的移植有一个重要前提仅支持长文件名long filename support。如果你希望在原生 DOS 下使用 83 短文件名规则编译则必须自行调整安装过程包括重命名那些名称非法illegal或会产生重名duplicate names的文件——例如 OpenSSL 源码中大量命名相近的头文件、多版本共存的目标文件等在 83 命名空间下极易冲突这是该移植默认不支持短文件名模式的根本原因。从仓库的构建配置可以看出DJGPP 是 OpenSSL 众多 Unix 系构建目标中特殊的一员Configurations/50-djgpp.conf 开头的注释明确写道We cant make any commitment to support the DJGPP platform, and rely entirely on the OpenSSL community to help is fine tune and test.即官方不对 DJGPP 平台做支持承诺其构建与测试完全依赖社区。这一点意味着使用 DJGPP 构建 OpenSSL 时应保持社区维护的心态遇到问题需要自行定位与反馈。完整的环境准备开始编译之前必须安装一套完整的 DJGPP 环境包括最新版本的以下组件DJGPP本体运行时库与工具链核心GCC编译器BINUTILS汇编器、链接器等二进制工具BASHDJGPP 环境下的 Unix shellPERL及 Perl 模块Text::Template关于 Perl 的要求NOTES-PERL.md 给出了更细致的规定OpenSSL 的构建脚本大量依赖 Perl且最低要求 Perl 5.10.0因为构建脚本使用了\R正则转义序列等新特性Text::Template模块是构建阶段for building必需的仓库源码中已内置一份该模块的副本作为兜底We include a copy of this module in the source. It will work as a fallback if the module isnt already installed.。如果只编译而不运行测试则测试专用的Test::More模块最低 0.96 版可以忽略。在 Debian 系 Linux 上可通过包管理器安装该模块$ apt-cache search Text::Template libtext-template-perl - perl module to process text templates $ sudo apt-get install libtext-template-perl或使用 CPAN注意 DJGPP 的 BASH 环境中同样适用$ cpan -i Text::TemplateWATT-32 网络库与 WATT_ROOTOpenSSL 的 DJGPP 移植还需要WATT-32网络包一个针对 DOS 环境的 TCP/IP 协议栈实现才能编译。Makefile 假定 WATT-32 的代码位于环境变量WATT_ROOT所指定的目录中。例如若 watt32 位于 DJGPP 主目录下的watt32子目录则应设置export WATT_ROOT/dev/env/DJDIR/watt32这一变量在构建配置中会被直接引用详见下文50-djgpp.conf中cflags与lflags的写法因此必须在执行 Configure 之前正确设置否则头文件路径与链接库路径都会解析失败。构建目标 DJGPP 的配置定义剖析./Configure DJGPP实际加载的构建目标定义位于 Configurations/50-djgpp.conf其完整内容如下my %targets ( DJGPP { inherit_from [ BASE_unix ], CC gcc, CFLAGS -fomit-frame-pointer -O2 -Wall, cflags -I\$(WATT_ROOT)/inc -DTERMIOS -DL_ENDIAN, sys_id MSDOS, lflags add(-L\$(WATT_ROOT)/lib), ex_libs add(-lwatt), bn_ops BN_LLONG, asm_arch x86, perlasm_scheme a.out, }, );逐项解读配置项值含义inherit_fromBASE_unix继承 Unix 基础目标DJGPP 构建沿用 Unix 风格的 Makefile 与配置流程CCgcc编译器固定为 DJGPP 的 GCCCFLAGS-fomit-frame-pointer -O2 -Wall全局优化与告警选项省略帧指针、O2 优化、开启常规警告cflags-I$(WATT_ROOT)/inc -DTERMIOS -DL_ENDIAN追加头文件搜索路径指向 WATT-32 的inc目录-DTERMIOS启用 termios 风格终端 I/O-DL_ENDIAN声明 x86 小端字节序little-endiansys_idMSDOS系统标识为 MSDOS用于OPENSSL_SYS_MSDOS之类的条件编译宏判断lflagsadd(-L$(WATT_ROOT)/lib)链接时追加库搜索路径指向 WATT-32 编译好的库目录ex_libsadd(-lwatt)追加外部链接库libwatt即 WATT-32 网络库bn_opsBN_LLONG大数运算使用long long64 位辅助在 32 位环境提升乘法/除法性能asm_archx86汇编架构为 x86允许使用 x86 汇编优化模块perlasm_schemea.out由 perlasm 生成汇编时采用a.outUnix a.out格式约定可以看到WATT_ROOT环境变量被同时用于编译期头文件路径-I$(WATT_ROOT)/inc和链接期库路径-L$(WATT_ROOT)/lib这也印证了上一节先设 WATT_ROOT 再 Configure的必要性。配置与编译标准三步在 BASH shell 中执行配置命令./Configure no-threads --prefix/dev/env/DJDIR DJGPP参数说明DJGPP指定使用上述构建目标。no-threads禁用线程支持。DJGPP 平台没有 POSIX 线程实现且文档明确指出应使用该选项底层源码同样围绕无线程/无/dev/random的环境做条件编译适配。--prefix/dev/env/DJDIR安装前缀指向 DJGPP 环境根目录/dev/env/DJDIR是 DJGPP 下表示安装根的特殊路径使 OpenSSL 的头文件、库与可执行程序最终安装进 DJGPP 自身的目录树中方便后续交叉使用。配置成功后直接启动编译makeDPMI 选择器耗尽问题在 Windows 下的 DOS 窗口中运行 DJGPP 程序时可能遇到DPMI 选择器DPMI selectors耗尽的情况——这是 DOS 保护模式接口DOS Protected Mode Interface资源的典型限制make进程或子进程会因此失败。文档给出的处理办法非常直接关闭当前的 BASH shell退回 Windows重新启动 BASH再次执行make。这实质上是通过释放前一个 DOS 会话占用的 DPMI 资源来继续构建属于该平台特有的重试式恢复手段。运行时警告随机数种子来源文档以RUN-TIME CAVEAT LECTOR运行期读者须知为标题专门强调了一个关键问题密码学软件需要不可预测的数据源才能正确工作。多数开源操作系统通过随机数设备/dev/urandom或/dev/random提供这一来源而 DOS 环境默认没有此类设备。自版本 0.9.7f 起DJGPP 移植会在运行时检查/dev/urandom$注意结尾的$这是 DOS 设备命名的特殊写法是否存在第三方随机数DOS 驱动程序一个典型的实现是NOISE.SYS它通过收集硬件噪声等方式向/dev/urandom接口提供熵。从仓库源码可以印证这一机制在 OpenSSL 3.x 中的延续随机种子seed的采集统一经由 providers/implementations/rands/seed_src.c 中的seed_get_seed等回调而 Unix 系平台的底层实现在 providers/implementations/rands/seeding/rand_unix.c其中定义了random_device_paths[] { DEVRANDOM }通过open()打开随机设备并从中读取熵若未配置DEVRANDOM构建期直接以#error Seeding uses urandom but DEVRANDOM is not configured拒绝编译。在没有该设备如裸 DOS DJGPP的环境下随机数生成将缺少可用的熵源因此若编译目标是运行在具备NOISE.SYS之类驱动、且模拟了/dev/urandom访问的 DOS 环境随机数子系统可正常工作否则任何依赖强随机数的操作密钥生成、TLS 握手等都可能因熵不足而失败或退化。这属于平台级运行约束而非可配置项。使用 DJGPP 构建版本前务必确认目标 DOS 环境的随机数驱动已就绪。总结OpenSSL 的 DJGPP 移植是一套典型的社区维护型平台支持构建目标定义集中在 Configurations/50-djgpp.conf继承BASE_unix、绑定 GCC、内嵌 WATT-32 路径与-lwatt链接整个构建流程依赖 BASH Perl含Text::Template参见 NOTES-PERL.md核心编译命令为./Configure no-threads --prefix/dev/env/DJDIR DJGPP后接make。实践中的两个关键要点是其一务必预先设置WATT_ROOT并安装 WATT-32其二运行时必须有/dev/urandom类的随机数驱动如NOISE.SYS否则密码学操作缺少熵源。对于希望将 OpenSSL 带到传统 DOS 环境中的开发者上述流程与限制是完整、可复现的起点。【免费下载链接】opensslGeneral purpose TLS and crypto library项目地址: https://gitcode.com/GitHub_Trending/ope/openssl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表