OpenSSL庫的交叉編譯(arm和mips)

0x00 前言

這篇文章介紹了關於在Linux下對OpenSSL進行交叉編譯(arm和mips)的方法,以及踩到的一些坑。

相關知識

  • OpenSSL 是一個安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程序供測試或其它目的使用。
  • 默認下載下來的OpenSSL編出來的是x86體系結構的
  • arm和mips是兩種體系結構

環境說明

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章