移植openssl到32位的mips核心板上的详细步骤及遇到的问题解决

概述:因工作需求,需要移植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。
移植openssl到32位的mips核心板上的详细步骤及遇到的问题解决_第1张图片
移植openssl到32位的mips核心板上的详细步骤及遇到的问题解决_第2张图片
保存退出。

执行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);函数就出现这个错误,我们只能定位源码了。
移植openssl到32位的mips核心板上的详细步骤及遇到的问题解决_第3张图片
这里是源码的调试过程的一个贴图。
移植openssl到32位的mips核心板上的详细步骤及遇到的问题解决_第4张图片

定位到BN_MONT_CTX_set_locked函数。
移植openssl到32位的mips核心板上的详细步骤及遇到的问题解决_第5张图片
定位到BN_MONT_CTX_set函数。
移植openssl到32位的mips核心板上的详细步骤及遇到的问题解决_第6张图片
这里我们就定位到问题了,我们在32位的核心板上运行的是64位的代码。所以,我们就要解决这个问题了。

3,解决Floating point exception 浮点错误问题。
我们具体查看源码中BN_BITS2的定义如下:
移植openssl到32位的mips核心板上的详细步骤及遇到的问题解决_第7张图片

然后网上搜索到这篇博客,说要将opensslconfig.h中的文件修改,我这边纠正一下(也有可能版本不同的原因),opensslconfig.h文件并不在源码cypto目录下,而是在源码include/openssl/opensslconfig.h目录下。所以试着修改.h文件如下:
移植openssl到32位的mips核心板上的详细步骤及遇到的问题解决_第8张图片
当我按这样的方法做完,make的时候出错,可能由于版本原因,我这里把crypto/include/internal/bn_config.h头文件也按上述方法重新修改,然后编译通过了。如下:
移植openssl到32位的mips核心板上的详细步骤及遇到的问题解决_第9张图片

编译通过后,我重新把动态库so文件复制到核心板,此时我们再看结果,哈哈,运行成功了。
移植openssl到32位的mips核心板上的详细步骤及遇到的问题解决_第10张图片

4,真正解决Floating point exception 浮点错误移植问题。
按理说上面的问题已经解决了,但是我还是觉得修改源码肯定不是一个好方法,既然源库定义了64位32位这些选项,那肯定是可以通过config配置去改变的。我们可以查看我们之前的Makefile文件,我们把linux-x86_64修改为了mips,但这并没用,因为我们的系统是64位的,所以他默认构建的是我们64位的代码,而我们移植到的mips是32位的。所以我们要在64位系统上设置编译出32位版本的库。这里我们可以通过setarch命令,将我们当前环境设置为i386即32位系统。setarch命令定义如下:
移植openssl到32位的mips核心板上的详细步骤及遇到的问题解决_第11张图片
这里我也是参考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.如下:
移植openssl到32位的mips核心板上的详细步骤及遇到的问题解决_第12张图片
移植openssl到32位的mips核心板上的详细步骤及遇到的问题解决_第13张图片

然后我们再将生成的动态库复制到核心板上,运行测试程序,依旧是成功的。到此,这个问题算是从根本上解决啦。以此记录,作为相同的开发人员可以少走点弯路。Peace&Love!

你可能感兴趣的:(嵌入式学习笔记)