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......
,則表明安裝成功
- 在鏈接: http://www.arm9.net/download.asp 中下載
- 安裝
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
進行編譯
- 在OpenSSL的文件夾路徑下的命令行中,輸入
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
進行編譯
- 在OpenSSL的文件夾路徑下的命令行中,輸入
注意: 不能直接用複製出來的Makefile
覆蓋解壓的文件夾中的Makefile
,必須修改上述的那幾條語句,否則編譯不通過
0x04 測試
進入文件夾中的test/
目錄,命令行下輸入file ectest.o
查看是不是相應的架構即可。
0x05 總結
網上的資料太雜了,在搞了兩天以後終於編譯成功了,遂自己總結了這份可以復現的交叉編譯步驟,方便日後自己或他人查閱。
有什麼有錯的地方還請批評指正!
參考資料
- mipsel-openwrt-linux交叉編譯openssl-1.0.2l:
https://blog.csdn.net/weixin_39510813/article/details/82705422 - 在ubuntu 16.04 下搭建 mips 交叉編譯環境:
https://segmentfault.com/a/1190000010060338