OpenSSL库的交叉编译(arm和mips)

0x00 前言

这篇文章介绍了关于在Linux下对OpenSSL进行交叉编译(arm和mips)的方法,以及踩到的一些坑。

相关知识

  • OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
  • 默认下载下来的OpenSSL编出来的是x86体系结构的
  • arm和mips是两种体系结构

环境说明

  • 系统:Ubuntu 16.04LTS
  • arm的交叉编译器:arm-linux-gcc-4.4.3
  • mips的交叉编译器: mipsel-openwrt-linux
  • OpenSSL: 1.0.1f,最后面的f只是代表了一个版本,下载链接:
    https://github.com/openssl/openssl/releases/tag/OpenSSL_1_0_1f , 下载完后解压,进入目录中

0x01 OpenSSL在arm下的交叉编译

  • 安装arm-linux-gcc:
    • 在链接: http://www.arm9.net/download.asp 中下载ARM-Linux GCC 4.4.3
    • 解压: sudo tar xvzf arm-linux-gcc-4.4.3.tgz -C/, 执行该命令,将把arm-linux-gcc 安装到/opt/Friendlyarm/toolschain/4.4.3 目录
    • 建立目录: sudo mkdir /usr/local/arm
    • 复制文件: sudo cp -r /opt/FriendlyARM/toolschain/4.4.3 /usr/local/arm
    • 配置环境变量: sudo vim /etc/bash.bashrc, 在最后加上 export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin
    • source /etc/bash.bashrc
    • 测试是否安装成功: 终端,输入arm-,然后按两下Tab,如果出现arm2hpdl arm-linux-gprof arm-elf-addr2line arm-linux-ld arm-elf-ar arm-linux-nm arm-elf-as arm-linux-objcopy......,则表明安装成功
  • 安装32位库: sudo apt-get install ia32-libs, sudo apt-get install lib32z1, 否则在make的时候会报arm-none-linux-gnueabi-gcc:not found的错误
  • 对Openssl进行编译:
    • 在OpenSSL的文件夹路径下的命令行中,输入./config no-asm shared --prefix=/opt/openssl_1_0_1f_mips/
      • 该语句会生成Makefile文件,或者更新覆盖掉原有的文件
      • 如果遇到target already defined 的报错, 则使用CC=arm-none-linux-gnueabi-gcc ./config no-asm shared
    • 修改Makefile:
      • PLATFORM=arm;
      • CC=/opt/FriendlyARM/toolschain/4.4.3/bin/arm-none-linux-gnueabi-gcc
      • AR=/opt/FriendlyARM/toolschain/4.4.3/bin/arm-none-linux-gnueabi-ar $(ARFLAGS) r
      • RANLIB=/opt/FriendlyARM/toolschain/4.4.3/bin/arm-none-linux-gnueabi-ranlib
      • NM=/opt/FriendlyARM/toolschain/4.4.3/bin/arm-none-linux-gnueabi-nm
      • 删除文件中所有的-m64
    • make进行编译

0x02 OpenSSL在mips下的交叉编译

  • 安装mipsel-openwrt-linux(参考资料2):
    • 进入http://archive.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/
    • 下载包含ToolChain的压缩包: OpenWrt-Toolchain-ramips-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2
    • 解压缩该压缩包,并将其mv/opt/中,比如:/opt/OpenWrt-ToolChain-ramips-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2/, 相关的可执行文件在/opt/OpenWrt-ToolChain-ramips-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2/OpenWrt-ToolChain-ramips-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2/bin目录下
    • mipsel-openwrt-Linux-gcc添加进环境变量:
      • sudo vim /etc/bash.bashrc
      • 在末尾添加: export PATH=/opt/OpenWrt-ToolChain-ramips-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2/OpenWrt-ToolChain-ramips-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2/bin:$PATH
      • 然后执行source /etc/bash.bashrc
  • 对openssl进行编译(参考资料1):
    • 在OpenSSL的文件夹路径下的命令行中,输入./config no-asm shared --prefix=/opt/openssl_1_0_1f_mips/
      • 该语句会生成Makefile文件,或者更新覆盖掉原有的文件
    • 修改Makefile:
      • PLATFORM=mips
      • CC=/opt/OpenWrt-ToolChain-ramips-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2/OpenWrt-ToolChain-ramips-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-gcc
      • AR=/opt/OpenWrt-ToolChain-ramips-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2/OpenWrt-ToolChain-ramips-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-ar $(ARFLAGS) r 注意从这个步骤开始都只截取到mipsel-openwrt-linux-
      • RANLIB=/opt/OpenWrt-ToolChain-ramips-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2/OpenWrt-ToolChain-ramips-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-ranlib
      • NM=/opt/OpenWrt-ToolChain-ramips-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2/OpenWrt-ToolChain-ramips-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-nm
      • 安装zlib(可能不需要):sudo apt-get install zliblg-dev
      • 删除文件中所有的-m64
    • make进行编译

注意: 不能直接用复制出来的Makefile覆盖解压的文件夹中的Makefile,必须修改上述的那几条语句,否则编译不通过

0x04 测试

进入文件夹中的test/目录,命令行下输入file ectest.o查看是不是相应的架构即可。

0x05 总结

网上的资料太杂了,在搞了两天以后终于编译成功了,遂自己总结了这份可以复现的交叉编译步骤,方便日后自己或他人查阅。

有什么有错的地方还请批评指正!


参考资料

  1. mipsel-openwrt-linux交叉编译openssl-1.0.2l:
    https://blog.csdn.net/weixin_39510813/article/details/82705422
  2. 在ubuntu 16.04 下搭建 mips 交叉编译环境:
    https://segmentfault.com/a/1190000010060338

你可能感兴趣的:(Linux)