博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
移植openssl到32位的mips核心板上的详细步骤及遇到的问题解决
阅读量:4166 次
发布时间:2019-05-26

本文共 2404 字,大约阅读时间需要 8 分钟。

概述:因工作需求,需要移植openssl开源库到mips架构的核心板上。所以,就开始移植吧。

上位机环境:ubuntu14.04 64位

核心板: mips linux 32位

1,openssl移植。

先下载源码,这是开源库直接去官网自己下载就行啦。我下载的openssl-1.1.0g版本。然后参考这篇来进行移植。
我们进入源码目录,执行config脚本,我这里写了个运行config的shell脚本,方便修改。如下:

#!/bin/bashlibdir="/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的答案去做的,.
我重新修改了,config执行脚本。只需在config前加上setarch i386。如下:

#!/bin/bashlibdir="/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-gccsetarch 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!

你可能感兴趣的文章
嵌入式100题(038):HTTPS与HTTP的一些区别
查看>>
嵌入式100题(042):为什么服务端易受到SYN攻击?
查看>>
嵌入式100题(043):什么是四次挥手
查看>>
嵌入式100题(044):为什么客户端最后还要等待2MSL?
查看>>
嵌入式100题(045):为什么建立连接是三次握手,关闭连接确是四次挥手呢?...
查看>>
嵌入式100题(028):static的用法(定义和用途)
查看>>
嵌入式100题(027):char和int之间的转换
查看>>
嵌入式100题(029):const常量和#define的区别(编译阶段、安全性、内存占用等)...
查看>>
嵌入式100题(030):volatile作用和用法
查看>>
嵌入式100题(033):TCP、UDP的优缺点
查看>>
嵌入式100题(035):TCP为什么是可靠连接
查看>>
嵌入式100题(034):TCP UDP适用场景
查看>>
嵌入式100题(70):一个程序从开始运行到结束的完整过程(四个过程)
查看>>
嵌入式100题(71):什么是堆,栈,内存泄漏和内存溢出?
查看>>
嵌入式100题(73):死锁的原因、条件 创建一个死锁,以及如何预防
查看>>
嵌入式100题(74):硬链接与软链接的区别
查看>>
嵌入式100题(75):计算机中,32bit与64bit有什么区别
查看>>
嵌入式100题(60):系统调用的作用
查看>>
C语言基本概念归纳
查看>>
初识单片机
查看>>