openssl交叉编译

Posted by 周思进 on September 12, 2020

一、源码下载

官方网站下载最新版本的 openssl,需要注意推荐使用1.1.1版本,1.1.0及1.0.2版本都已不再支持维护,如系统还在使用老版本的openssl,也应尽快升级到1.1.1版本。

image

直接点击上图中的 openssl-1.1.1g.tar.gz 下载源码压缩包,通过浏览器完成下载,也可以使用 wget 方式下载,如下

wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz


二、配置选项

1、下载完成后,进行解压缩:

tar xzvf openssl-1.1.1g.tar.gz

2、查看 INSTALL 及 NOTES.UNIX 文档了解相关编译安装细节,几个常用的配置选项说明:

–cross-compile-prefix=PREFIX
指定交叉编译工具链,以连接号结束,如 arm-linux-gnueabihf-

–prefix=DIR
指定 openssl 的安装目录,如果只是想生成库文件,没有必要执行 make install 命令,也就可以不用指定该选项

–openssldir=DIR
指定 openssl 配置文件的安装目录,如果不指定,默认安装到 –prefix 指定目录下的 ssl 目录

no- 不支持指定版本协商

no- 不支持指定算法


三、编译安装

首先需要生成 Makefile 文件,可以通过 config 或者 Configure 脚本配置生成。 下面先以 config 配置示例,再用 Configure 配置对比两者的区别。

$./config --cross-compile-prefix=arm-linux-gnueabihf-  --prefix=`pwd`/tmp 
$make

编译过程中出现如下错误:

arm-linux-gnueabihf-gcc: error: unrecognized command line option '-m64'

解决办法:
修改makefile,删除所有-m64的地方

接着编译出现一堆汇编错误,可以通过增加 no-asm 选项解决

如果有出现如下的错误信息,因为没有提供GNU C的ucontext库,则还需要增加 no-async 选项解决

./libcrypto.so: warning: gethostbyname is obsolescent, use getnameinfo() instead.
./libcrypto.so: undefined reference to `getcontext'
./libcrypto.so: undefined reference to `setcontext'
./libcrypto.so: undefined reference to `makecontext'

这样基本就编译过了,如果用 Configure 来配置生成 Makefile,方式如下:

./Configure linux-armv4 --cross-compile-prefix=arm-linux-gnueabihf-  --prefix=`pwd`/tmp 


config 和 Configure 的区别

Configure 需要指定平台信息,比如像上面那样直接指定是 arm 平台,则 Makefile 中也就不会出现 m64 选项,不需要像 config 那样再手动去修改 Makefile 脚本。

而 config 则是自己去检测当前的系统环境,自动识别系统内核信息和编译器并设定参数等,然后将相关选项再传递给 Configure 脚本去完成最终配置。
而交叉编译的时候基本就会存在问题,所有更推荐使用 Configure 方式来进行配置操作。

但 Configure 需要自己指定目标平台信息,这个可以通过将 config 脚本放置目标平台,然后通过 ./config -t 命令来查看其检测显示的对应平台信息,如下:

image

最后会显示 ./Configure linux-armv4

补充说明下,配置操作改写和生成 opensslconf.h 和 opensslv.h 头文件,opensslv.h 主要记录当前库使用的版本信息,而 opensslconf.h 则主要显示编译 openssl 库时的选项配置情况。