【无标题】openssl引擎编写undefined symbol: bind_engine解决方法

博客讲述了在尝试加载OpenSSL自定义引擎OSSL_EngineX时遇到的DSO支持错误,具体表现为无法绑定到请求的符号。通过将原始C文件转换为CPP文件并使用g++编译导致了错误。但将文件改回C文件并用gcc编译后,问题得到解决。作者推测可能是之前的编译缺少了某些选项。经过修正,引擎成功加载并进行了测试,确认功能正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

root@cd2e1925ffbe:/work/CyberSecurityCode/OSSL_EngineX# ./build/basic_digest.o
OpenSSL failed to load required configuration
140691275559808:error:2506406A:DSO support routines:dlfcn_bind_func:could not bind to the requested symbol name:crypto/dso/dso_dlfcn.c:188:symname(bind_engine): /work/CyberSecurityCode/OSSL_EngineX/build/engine_ex.so: undefined symbol: bind_engine
140691275559808:error:2506C06A:DSO support routines:DSO_bind_func:could not bind to the requested symbol name:crypto/dso/dso_lib.c:186:
140691275559808:error:260B6068:engine routines:dynamic_load:DSO failure:crypto/engine/eng_dyn.c:447:
140691275559808:error:260BC066:engine routines:int_engine_configure:engine configuration error:crypto/engine/eng_cnf.c:141:section=engine_x_section, name=dynamic_path, value=/work/CyberSecurityCode/OSSL_EngineX/build/engine_ex.so
140691275559808:error:0E07606D:configuration file routines:module_run:module initialization error:crypto/conf/conf_mod.c:177:module=engines, value=engine_section, retcode=-1
root@cd2e1925ffbe:/work/CyberSecurityCode/OSSL_EngineX#

问题:

        参照openssl引擎OSSL_EngineX下载编译后,运行时出错DSO support routines:dlfcn_bind_func:could not bind to the requested symbol name:crypto/dso/dso_dlfcn.c:188:symname(bind_engine):

        详细错误内容如上图。

解决方法:

        我是把原c文件改成cpp文件,用g++编译后出现了上面错误。我又改回去(改成.c文件,gcc编译)之后问题解决。

        具体原因不知道。大概原因可能是原先的编译可能导致某个编译选项没设置。

        

./build/basic_digest.o
call bind
EngineX has been successfully loaded
engine name :Engine example

解决后测试:

        

root@cd2e1925ffbe:/work/CyberSecurityCode/OSSL_EngineX/tests# openssl dgst -sha1 -engine /work/CyberSecurityCode/OSSL_EngineX/build/engine_ex.so plain.text
call bind
engine "engineX" set.
call sha1_init
call sha1_update
call sha1_final
SHA1(plain.text)= 86a6f5008a6194c19377fcfe1bd4464dcf2dc512
call sha1_init

<think>嗯,用户遇到了一个关于GmSSL的符号查找错误,具体是“undefined symbol: BIO_debug_callback, version OPENSSL_1_1_0d”。我需要先理解这个错误的含义和可能的原因。 首先,这个错误提示说明GmSSL在执行时找不到BIO_debug_callback这个符号,而该符号属于OPENSSL_1_1_0d版本。可能的情况是GmSSL在编译时链接的OpenSSL版本与运行时加载的版本不一致。用户可能同时安装了多个版本的OpenSSL,或者GmSSL依赖的库路径被错误地指向了不兼容的版本。 接下来,我需要回顾之前处理类似问题的经验,比如之前用户遇到的curl和OpenSSL版本不匹配的问题,解决方法包括清理旧版本、重新安装正确版本、调整库路径等。不过GmSSL是一个基于OpenSSL的分支,主要用于支持国密算法,可能涉及到不同的库文件。 可能的解决步骤包括: 1. 检查系统安装的OpenSSL和GmSSL版本是否存在冲突。 2. 确认GmSSL是否正确编译并链接到正确的库。 3. 更新或重新安装GmSSL,确保依赖项正确。 4. 使用ldd或LD_DEBUG检查运行时加载的库。 5. 调整LD_LIBRARY_PATH或使用ldconfig更新库缓存。 需要验证用户是否自行编译过OpenSSL或GmSSL,或者是否通过包管理器安装。此外,用户可能混合使用了不同来源的库文件,导致符号不匹配。 还需要考虑BIO_debug_callback是否在特定版本的OpenSSL中存在,或者是否在GmSSL中被修改或移除。比如,OpenSSL 1.1.0和1.1.1之间的符号变化可能导致这个问题。如果GmSSL是基于某个特定的OpenSSL版本构建的,而系统上安装的是另一个版本,就会出现符号找不到的情况。 另外,用户可能在使用GmSSL时,环境变量如LD_LIBRARY_PATH指向了错误的库路径,导致运行时加载了不兼容的OpenSSL版本。需要指导用户检查这些设置,并确保正确的库被优先加载。 总结来说,解决步骤可能包括: - 检查并更新GmSSL和OpenSSL的安装。 - 清理冲突的库文件。 - 调整动态链接库的路径和缓存。 - 确保版本兼容性。 需要将这些步骤以清晰的方式呈现给用户,分方法说明,并给出具体的命令示例,帮助用户逐步排查和解决问题。同时,提醒用户在操作前备份重要数据,避免系统库的误删导致其他问题。</think>--- ### 问题分析 你遇到的错误是典型的**动态库符号版本不匹配**问题: ```bash gmssl: symbol lookup error: gmssl: undefined symbol: BIO_debug_callback, version OPENSSL_1_1_0d ``` **根本原因**: - `BIO_debug_callback` 是 `OpenSSL 1.1.0` 版本中的符号(函数),但当前系统中加载的 OpenSSL 库(如通过包管理器安装的官方版本或自行编译的版本)不包含此符号。 - **两种常见触发场景**: 1. **库版本冲突**:系统中存在多个 OpenSSL/GmSSL 版本(如同时安装了官方 OpenSSL 和第三方编译的 GmSSL),导致动态链接器加载了错误的库文件。 2. **编译依赖问题**:GmSSL 在编译时链接了特定版本的 OpenSSL,但运行时加载的 OpenSSL 版本不一致(例如降级或升级后未重新编译)。 --- ### 解决方案 #### 方法一:统一 OpenSSL/GmSSL 版本(推荐) 1. **卸载冲突的 OpenSSL/GmSSL 版本** - 若通过源码安装过 OpenSSL 或 GmSSL: ```bash # 清理源码编译的库(假设默认安装路径为 /usr/local) sudo rm -rf /usr/local/lib/libssl* /usr/local/lib/libcrypto* /usr/local/bin/gmssl sudo ldconfig ``` - 若通过包管理器安装: ```bash # 卸载官方仓库中的版本(以 Ubuntu/Debian 为例) sudo apt remove --purge gmssl openssl ``` 2. **重新安装兼容版本** - **方案 1**:通过官方仓库安装 OpenSSL 1.1.0 或 GmSSL ```bash # 安装 OpenSSL 1.1.0(若仓库支持) sudo apt install openssl=1.1.0* libssl-dev=1.1.0* ``` ```bash # 或安装 GmSSL(若仓库提供) sudo apt install gmssl ``` - **方案 2**:源码编译 GmSSL(确保版本匹配) ```bash # 下载 GmSSL 源码(例如 2.5.4 版本) git clone https://github.com/guanzhi/GmSSL.git cd GmSSL ./config --prefix=/usr/local/gmssl make sudo make install # 添加环境变量 echo 'export PATH=/usr/local/gmssl/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/gmssl/lib:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc ``` 3. **验证符号存在性** ```bash # 检查 libcrypto.so 是否包含 BIO_debug_callback nm -D /usr/local/gmssl/lib/libcrypto.so | grep BIO_debug_callback ``` 输出应显示类似:`T BIO_debug_callback`。 --- #### 方法二:强制指定库路径(临时解决) 若系统存在多个 OpenSSL/GmSSL 版本,可临时指定运行时加载的库路径: ```bash # 假设 GmSSL 正确库路径为 /usr/local/gmssl/lib export LD_LIBRARY_PATH=/usr/local/gmssl/lib:$LD_LIBRARY_PATH ``` 运行 `gmssl` 测试是否正常。 > **注意**:此方法仅对当前终端会话有效,需永久生效可将其写入 `~/.bashrc`。 --- #### 方法三:高级排查与修复 1. **检查动态库依赖关系** ```bash # 查看 gmssl 运行时加载的库 ldd $(which gmssl) | grep -E 'ssl|crypto' # 示例输出: # libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 # libcrypto.so.1.1 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 ``` 确保输出指向正确的库路径(如 `/usr/local/gmssl/lib`)。 2. **重建动态库缓存** ```bash sudo ldconfig ``` 3. **检查符号版本兼容性** ```bash # 查看 libcrypto.so 的符号版本 objdump -T /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 | grep BIO_debug_callback # 期望输出包含 OPENSSL_1_1_0d 或兼容版本 ``` 若输出为空,说明当前库版本不兼容。 --- ### 补充说明 1. **关键符号背景** - `BIO_debug_callback` 是 OpenSSL 1.1.0 中用于调试的接口,后续版本可能已弃用或修改。 - GmSSL 可能基于 OpenSSL 的某个旧版本分支开发,需严格匹配依赖库版本。 2. **版本兼容性表** | 软件名称 | 兼容版本 | 备注 | |----------|------------------------|-----------------------| | GmSSL | 基于 OpenSSL 1.1.0d 开发 | 需确保 libcrypto 包含对应符号 | | OpenSSL | 1.1.0 系列 | 官方已停止维护,需谨慎降级 | --- ### 操作后验证 运行以下命令测试是否修复: ```bash gmssl version # 正常输出示例:GmSSL 2.5.4 - OpenSSL 1.1.0d ``` 若问题仍存在,请提供以下信息进一步分析: ```bash # 系统版本 lsb_release -a # GmSSL 安装路径及版本 which gmssl && gmssl version # 动态库依赖详情 ldd $(which gmssl) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值