openssl交叉编译 mips环境

本文介绍了如何在不同环境中使用 OpenSSL 1.0.1p 版本,并提供了详细的交叉编译步骤。包括配置、Makefile 修改、交叉编译命令等关键信息。

最近需要使用openssl库,选用了https://www.openssl.org/地址下的OpenSSL 1.0.1p版本

如果只是正常环境下使用openssl,编译比较简单,只需要解压缩openssl 1.0.1p版本

然后进入根目录按照如下命令:

1、./configure --prefix=/user/local

2、make & make install

这样就可以在编译并安装到/user/local路径下面。

 

一般情况下,我们需要把openssl应用到不同的环境中,这样需要我们进行交叉编译。

以下交叉编译的步骤:

1、./configure no-asm shared --prefix=/user/local/mips

2、修改makefile

我们可以在openssl的根目录下找到makefile文件。需要修改的通过红色标注出来,也就是我修改过的地方

CC= mipsel-openwrt-linux-gcc

CFLAG= -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -O3 -Wall 

DEPFLAG= -DOPENSSL_NO_EC_NISTP_64_GCC_128 -DOPENSSL_NO_GMP -DOPENSSL_NO_JPAKE -DOPENSSL_NO_MD2 -DOPENSSL_NO_RC5 -DOPENSSL_NO_RFC3779 -DOPENSSL_NO_SCTP -DOPENSSL_NO_STORE -DOPENSSL_NO_UNIT_TEST

PEX_LIBS= 

EX_LIBS= -ldl

EXE_EXT= 

ARFLAGS= 

AR= mipsel-openwrt-linux-ar $(ARFLAGS) r

RANLIB= mipsel-openwrt-linux-ranlib

NM= mipsel-openwrt-linux-nm

PERL= /usr/bin/perl

TAR= tar

TARFLAGS= --no-recursion --record-size=10240

MAKEDEPPROG= gcc

LIBDIR=lib

修改完成保存。

如果是mips交叉编译,修改完makefile后仍需要将此makefile文件中的-m64 后缀全部去掉。

makefile全篇应该一共只有两处。


3、执行make,即可看到在根目录下有动态库libcrypto.so libcrypto.so.1.0.0 libssl.so libssl.so.1.0.0 和 静态库libcrypto.a libssl.a。

OpenWrt 环境下进行 OpenSSL交叉编译,通常有两种场景: 1. **为 OpenWrt 固件添加 OpenSSL 支持(即在 OpenWrt SDK 或源码中编译 OpenSSL 包)** 2. **使用 OpenWrt 提供的交叉编译工具链手动交叉编译 OpenSSL 库供第三方程序使用** 下面以第二种情况为例:**使用 OpenWrt SDK 手动交叉编译 OpenSSL**,适用于你想将 OpenSSL 静态/动态链接到自己的应用程序中,并部署到 OpenWrt 路由器上。 --- ### ✅ 准备工作 你需要以下内容: - OpenWrt SDK(匹配你的路由器固件架构) - 下载地址:[https://downloads.openwrt.org](https://downloads.openwrt.org) - 示例:`OpenWrt SDK for ramips/mt76x8` - 解压 SDK - 安装依赖:`build-essential`, `gcc`, `make`, `wget`, `unzip` ```bash tar xjf OpenWrt-SDK-21.02.5-ramips-mt76x8_gcc-8.4.0_musl.Linux-x86_64.tar.bz2 cd OpenWrt-SDK-21.02.5-ramips-mt76x8_gcc-8.4.0_musl.Linux-x86_64 ``` --- ### ✅ 步骤一:下载 OpenSSL 源码 ```bash wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz tar -xzf openssl-1.1.1w.tar.gz cd openssl-1.1.1w ``` --- ### ✅ 步骤二:设置交叉编译环境变量 假设你使用的是 `mipsel` 或 `ramips` 架构(常见于 MT7621、MT7628),OpenWrt SDK 已提供交叉编译工具链。 ```bash # 设置 SDK 路径(根据实际路径调整) export SDK_PATH=~/openwrt/OpenWrt-SDK-21.02.5-ramips-mt76x8_gcc-8.4.0_musl.Linux-x86_64 export STAGING_DIR=$SDK_PATH/staging_dir # 设置目标架构的编译器前缀(以 ramips 为例,使用 musl) export CC=$SDK_PATH/staging_dir/toolchain-mipsel_24kc_gcc-8.4.0_musl/bin/mipsel-openwrt-linux-musl-gcc export AR=$SDK_PATH/staging_dir/toolchain-mipsel_24kc_gcc-8.4.0_musl/bin/mipsel-openwrt-linux-musl-ar export RANLIB=$SDK_PATH/staging_dir/toolchain-mipsel_24kc_gcc-8.4.0_musl/bin/mipsel-openwrt-linux-musl-ranlib ``` > ⚠️ 注意:不同架构的前缀不同,比如: > > - `aarch64`: `aarch64_openwrt-linux-gnu-gcc` > - `x86_64`: `x86_64-openwrt-linux-gnu-gcc` > - `armhf`: `arm-openwrt-linux-gnueabihf-gcc` 可通过 `$SDK_PATH/staging_dir/toolchain-*/bin/` 查看可用工具。 --- ### ✅ 步骤三:配置 OpenSSL(关键步骤) ```bash ./Configure linux-generic32 \ --prefix=/opt/openssl \ --openssldir=/opt/openssl/ssl \ no-shared \ no-asm \ no-thread \ no-zlib \ no-dso \ no-engine \ CC="$CC" \ AR="$AR" \ RANLIB="$RANLIB" ``` #### 参数说明: | 参数 | 含义 | |------|------| | `linux-generic32` | 通用 32 位 Linux 平台,适合大多数嵌入式 MIPS/ARM | | `--prefix` | 安装路径(可自定义) | | `no-shared` | 不生成 `.so` 动态库,只静态编译(节省空间) | | `no-asm` | 禁用汇编优化(避免某些架构兼容问题) | | `no-thread` | 禁用线程支持(减小体积) | | `no-zlib` | 不启用 zlib 压缩(除非你也交叉编译了 zlib) | | `CC/AR/RANLIB` | 指定交叉编译工具 | > 如果你要支持 TLS 1.3 和现代加密,请不要关闭太多功能。可根据设备性能权衡。 --- ### ✅ 步骤四:编译和安装 ```bash make depend make make install INSTALL_PREFIX=./output ``` 这会把编译好的文件安装到当前目录下的 `output` 文件夹中: ``` output/ ├── opt/ │ ├── openssl/ # 包含 bin, lib, include, ssl ``` 你可以将 `output/opt/openssl/lib` 加入你的程序链接路径,或将头文件复制到项目中使用。 --- ### ✅ 验证交叉编译结果 检查生成的库是否是目标架构: ```bash file output/opt/openssl/lib/libcrypto.a ``` 输出应类似: ``` output/opt/openssl/lib/libcrypto.a: current ar archive ``` 解压一个 `.o` 文件再查: ```bash ar x output/opt/openssl/lib/libcrypto.a aes_core.o file aes_core.o ``` 应显示为 `ELF 32-bit LSB relocatable, MIPS` 类似信息。 --- ### ✅ 在你的程序中使用 OpenSSL 示例 C 程序 `test_openssl.c`: ```c #include <openssl/ssl.h> #include <openssl/err.h> #include <stdio.h> int main() { SSL_library_init(); printf("OpenSSL initialized.\n"); return 0; } ``` 编译命令(静态链接): ```bash $CC -I./output/opt/openssl/include \ test_openssl.c \ ./output/opt/openssl/lib/libssl.a \ ./output/opt/openssl/lib/libcrypto.a \ -o test_ssl ``` 然后用 `file test_ssl` 检查是否为正确架构。 --- ### ✅ 可选:制作 IPK 包(集成进 OpenWrt) 如果你希望把 OpenSSL 打包成 `.ipk` 给 OpenWrt 使用,建议使用 OpenWrt 的 `Build System`(基于 Makefile 的包机制),新建一个 `package/openssl-custom` 目录并写 `Makefile`。 但一般推荐直接使用 OpenWrt 官方已有的 `libopenssl` 包: ```bash make menuconfig # -> Libraries -> ssl -> openssl ``` 然后 `make package/openssl/compile V=s` --- ### ✅ 常见问题与解决方案 | 问题 | 解决方法 | |------|---------| | `undefined reference to dlopen` | 添加 `no-dso` 并避免使用动态加载 | | 编译报错 `sys/auxv.h: No such file or directory` | 使用 `no-threads` 或 `no-async` | | `clock_gettime` 错误 | 添加 `-lrt` 链接库或打补丁 | | 架构不匹配 | 确保 `CC` 使用正确的交叉编译器 | --- ### ✅ 总结 以上流程实现了在 OpenWrt SDK 环境下对 OpenSSL 的完整交叉编译,适用于资源受限的嵌入式设备。核心在于: - 正确设置交叉编译器路径 - 关闭不必要的模块以适应嵌入式环境 - 使用静态编译简化部署 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clirus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值