概述:因工作需求,需要移植openssl开源库到mips架构的核心板上。所以,就开始移植吧。
上位机环境:ubuntu14.04 64位
核心板: mips linux 32位
1,openssl移植。
先下载源码,这是开源库直接去官网自己下载就行啦。我下载的openssl-1.1.0g版本。然后参考这篇博客来进行移植。
我们进入源码目录,执行config脚本,我这里写了个运行config的shell脚本,方便修改。如下:
#!/bin/bash
libdir="/home/sky/third_lib/opt/libopenssl"
docdir="/home/sky/third_lib/opt/libopenssl/share/doc/libopenssl-1.1.0g"
mandir="/home/sky/third_lib/opt/libopenssl/share/man"
cd /home/sky/software/openssl-1.1.0g
#设置交叉编译
export CC=mips-linux-gnu-gcc
./config --prefix=${libdir} \
no-asm \
mandir=${mandir} \
docdir=${docdir}
然后我们按照博客说的,打开Makefile文件,修改Makefile。博客中说删除-march=pentinum,我这是1.1.0版本并没有发现,所以就不做处理了。
修改linux-x86_64为mips,删除-m64。
保存退出。
执行make,make install命令
$ make
$ make install
确实按照这个方式编译成功了,然后我们把动态库复制到核心板上,运行一个rsa加密的测试程序。这时出现问题了,Floating point exception,浮点错误然后程序挂了。
2,定位出现Floating point exception 浮点错误问题的代码位置。
在我们的测试程序上,一运行到RSA_public_encrypt(strlen(clear_txt),clear_txt,encryptedText, rsa, RSA_PKCS1_PADDING);函数就出现这个错误,我们只能定位源码了。
这里是源码的调试过程的一个贴图。
定位到BN_MONT_CTX_set_locked函数。
定位到BN_MONT_CTX_set函数。
这里我们就定位到问题了,我们在32位的核心板上运行的是64位的代码。所以,我们就要解决这个问题了。
3,解决Floating point exception 浮点错误问题。
我们具体查看源码中BN_BITS2的定义如下:
然后网上搜索到这篇博客,说要将opensslconfig.h中的文件修改,我这边纠正一下(也有可能版本不同的原因),opensslconfig.h文件并不在源码cypto目录下,而是在源码include/openssl/opensslconfig.h目录下。所以试着修改.h文件如下:
当我按这样的方法做完,make的时候出错,可能由于版本原因,我这里把crypto/include/internal/bn_config.h头文件也按上述方法重新修改,然后编译通过了。如下:
编译通过后,我重新把动态库so文件复制到核心板,此时我们再看结果,哈哈,运行成功了。
4,真正解决Floating point exception 浮点错误移植问题。
按理说上面的问题已经解决了,但是我还是觉得修改源码肯定不是一个好方法,既然源库定义了64位32位这些选项,那肯定是可以通过config配置去改变的。我们可以查看我们之前的Makefile文件,我们把linux-x86_64修改为了mips,但这并没用,因为我们的系统是64位的,所以他默认构建的是我们64位的代码,而我们移植到的mips是32位的。所以我们要在64位系统上设置编译出32位版本的库。这里我们可以通过setarch命令,将我们当前环境设置为i386即32位系统。setarch命令定义如下:
这里我也是参考stackoverflow的答案去做的,how do compile openssl in 32 bit model on a 64 bit system.
我重新修改了,config执行脚本。只需在config前加上setarch i386。如下:
#!/bin/bash
libdir="/home/sky/third_lib/opt/libopenssl"
docdir="/home/sky/third_lib/opt/libopenssl/share/doc/libopenssl-1.1.0g"
mandir="/home/sky/third_lib/opt/libopenssl/share/man"
cd /home/sky/software/openssl-1.1.0g
#设置交叉编译
export CC=mips-linux-gnu-gcc
setarch i386 ./config --prefix=${libdir} \
no-asm \
mandir=${mandir} \
docdir=${docdir}
这样设置以后,我们已经无需修改Makefile文件了,直接make,make Install即可,因为此时Makefile文件里你找不到-m64了。他已经默认编译32位了。编译完以后我们可以看到我们之前做的.h文件修改都没了,而是它自己最标准的生成的(都是由对应的.h.in文件自动生成的),且定义了THIRTY_TWO_BIT.如下:
然后我们再将生成的动态库复制到核心板上,运行测试程序,依旧是成功的。到此,这个问题算是从根本上解决啦。以此记录,作为相同的开发人员可以少走点弯路。Peace&Love!