本文章记录了将openssl移植到arm-linux下的全部过程
移植环境
编译环境:Ubuntu18.04-amd64
模板环境:i.mx6ulLinux4.1.15
编译链:arm-linux-gnueabihf-4.7
下载openssl源代码
在官网下载源代码,我使用的最新版本1.1.1c,官网链接如下:
或则直接下载链接如下
直接下载链接
在linux下可以使用如下命令直接下载
wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz
下载完成后解压,解压命令如下:
tar zxvf openssl-1.1.1c.tar.gz
步入解压后的openssl-1.1.1c文件夹下linux移植涉及到地址吗,按照习惯应当使用./config进行配置手动生成Makefile文件
./config no-asm shared --prefix=/home/xx/arm-openssl/ CROSS_COMPILE=/home/xx/arm-linux-gnueabihf-4.7/bin/arm-linux-gnueabihf- CC=gcc
完成后直接make就行
然而!发觉编译过程大量警告,基本都是64位和32位不兼容问题。这个可以忽视。
之后严重的问题是arm-linux-gnueabihf-4.7编译器是不提供GNUC的ucontext库,最后有些tools找不到对应函数,造成编译报错。
也就是./config的简单配置是不行的,要用./Configure的自定义配置
./Configure linux-generic32 no-asm shared no-async --prefix=/home/xx/arm-software/arm-openssl CROSS_COMPILE=/home/xx/arm-linux-gnueabihf-4.7/bin/arm-linux-gnueabihf- CC=gcc
这儿解释下:
linux-generic32表示标准32位linux
no-asm:是在交叉编译过程中不使用汇编代码代码加速编译过程,缘由是它的汇编代码是对arm格式不支持的
shared:生成动态联接库
no-async:没有提供GNUC的ucontext库
完成后直接
make
make install
之后在里面—prefix=指定路径下就找到了编译好的文件
之后查看文件属性
确定交叉编译成功。
移植到开发板下
将编译好的文件夹打包发送到开发板下任意可读写目录,之后解压缩。
比如我置于了/opt/openssl下,得到如下路径和文件夹
步入bin目录运行openssl报错
查看该so文件在lib目录下呢qq linux,说明环境变量不对,更改环境变量
export LD_LIBRARY_PATH=/opt/openssl/lib:$LD_LIBRARY_PATH
里面命令以我的路径为例linux移植涉及到地址吗,请自行更改自己的lib路径。运行后再步入bin目录运行openssl程序红帽linux,见到>就是说明运行成功了
下边测试下openssl在i.mx6ul(CortexA7单核800MHz)下的性能吧,以RSA-2048为例:
./openssl speed rsa2048
妈耶!私匙生成每秒8.4次???!!!还好这个过程不会很频繁啊(大约吧,SSL和TLS我也不懂)。
结语
其实记录下所有移植过程,便捷自己追忆并置于其他人走弯路。不过i.mx6ul跑openssl确实不太适宜,低频Cortex-A7对于大运算量还是有点费力了。
之前移植ptyhon2.7和sqlite过程就没有记录,如今也不想再来一次了。下一步有时间了计划移植ubuntu-core文件系统到i.mx6ul下,不晓得256MB的FLASH能够放得下。假如可以能够免去交叉编译之苦了。
有啥不对的地方欢迎见谅,有哪些问题欢迎留言阐述。