编译LicheePi Zero的U-Boot时出现OpenSSL函数未定义引用问题
解决U-Boot交叉编译时OpenSSL函数未定义引用问题
核心原因
你当前使用的是主机(x86架构)的OpenSSL库,而交叉编译ARM架构的U-Boot需要对应ARM架构的OpenSSL库,直接添加-lcrypto和-lssl只会让链接器查找主机的库,导致架构不匹配、函数无法找到。解决步骤
交叉编译ARM架构的OpenSSL库
- 下载与U-Boot依赖版本匹配的OpenSSL源码(推荐1.1.x系列,避免版本兼容问题)
- 配置交叉编译环境:
其中./Configure linux-armhf --prefix=/opt/openssl-arm --cross-compile-prefix=/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf---prefix指定ARM版OpenSSL的安装路径,--cross-compile-prefix对应你的交叉编译器前缀 - 编译并安装:
make -j$(nproc) make install
让U-Boot编译时调用ARM版OpenSSL库
两种可选方式:- 方式一:通过编译参数指定路径
在原编译命令中添加OpenSSL库和头文件路径:make ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- OPENSSL_LIBPATH=/opt/openssl-arm/lib OPENSSL_INCPATH=/opt/openssl-arm/include -V=1 - 方式二:修改U-Boot配置文件
在U-Boot根目录的.config中添加:
保存后重新执行原编译命令CONFIG_SYS_OPENSSL_LIB_PATH=/opt/openssl-arm/lib CONFIG_SYS_OPENSSL_INCLUDE_PATH=/opt/openssl-arm/include
- 方式一:通过编译参数指定路径
备选方案:禁用U-Boot的OpenSSL依赖
如果不需要U-Boot的加密、签名验证等功能,可直接关闭相关配置:make menuconfig进入
Security features菜单,取消勾选所有依赖OpenSSL的选项(如CONFIG_CMD_BOOTMENU、加密启动相关项),保存配置后重新编译。
排查要点
- 确认ARM版OpenSSL安装目录下的
lib文件夹中存在libcrypto.so和libssl.so文件 - 检查U-Boot配置是否开启了需要OpenSSL的功能,若误开启可关闭
- 确保交叉编译器架构(arm-linux-gnueabihf)与OpenSSL配置的目标架构(linux-armhf)匹配
- 确认ARM版OpenSSL安装目录下的
内容的提问来源于stack exchange,提问作者Tomás Arturo Herrera Castro
相关产品推荐
相关产品推荐

