1. 程式人生 > >OpenWRT(MIPS)交叉編譯OpenSSL

OpenWRT(MIPS)交叉編譯OpenSSL

引言

因為很多嵌入式模組需要 libssl 和 libcrypto 庫,所以編寫此文。本文是使用mips編譯器編譯OpenSSL,並安裝在/usr/local/mips,編譯安裝好後以後可以直接引用。

1、下載和配置

下載和解壓:

cd /opt/
wget https://www.openssl.org/source/openssl-1.0.2l.tar.gz
tar zxf openssl-1.0.2l.tar.gz 
cd openssl-1.0.2l

2、配置

這裡的配置會分為兩種方法。

方法一

configure

配置成不要有ASM程式碼:

./configure no-asm
shared --prefix=/usr/local/mips

OR

./config no-asm shared --prefix=/usr/local/mips

--prefix為指定make install安裝路徑。

修改Makefile

修改CCARRANLIBNM等路徑,指向MISP編譯器:

假設 toolchain 路徑為:/opt/openwrt-toolchain/mips/bin/mips-openwrt-linux-gcc

# 1、修改CC
CC= /opt/openwrt-toolchain/mips/bin/mips-openwrt-linux-gcc

CFLAG= -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -O3 -Wall 
DEPFLAG
= -DOPENSSL_NO_EC_NISTP_64_GCC_128 -DOPENSSL_NO_GMP -DOPENSSL_NO_JPAKE -DOPENSSL_NO_MD2 -DOPENSSL_NO_RC5 -DOPENSSL_NO_RFC3779 -DOPENSSL_NO_SCTP -DOPENSSL_NO_STORE -DOPENSSL_NO_UNIT_TEST PEX_LIBS= EX_LIBS= -ldl EXE_EXT= ARFLAGS= # 2、修改AR AR= /opt/openwrt-toolchain/mips/bin/mips-openwrt-linux-ar $(ARFLAGS)
r # 3、修改RANLIB RANLIB= /opt/openwrt-toolchain/mips/bin/mips-openwrt-linux-ranlib # 4、修改NM NM= /opt/openwrt-toolchain/mips/bin/mips-openwrt-linux-nm PERL= /usr/bin/perl TAR= tar TARFLAGS= --no-recursion --record-size=10240 MAKEDEPPROG= gcc LIBDIR=lib # 註釋下面這一行 #SHARED_LDFLAGS=-m64

修改完成儲存。

如果是mips交叉編譯,後仍需要將此 Makefile 檔案中的-m64字尾全部去掉。在VIM環境下可以使用/-m64回車查詢,然後按下n查詢下一個,全文應該只有兩處!

方法二

這個方法我覺得比較通用,應該不止適用於編譯OpenSSL,但是無論怎樣最後最好都檢查一下Makefile

首先配置環境變數:

$ export PATH=/opt/openwrt-toolchain/mips/bin:$PATH
$ echo $PATH
/opt/openwrt-toolchain/mips/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/lzq/.local/bin:/home/lzq/bin

配置編譯器,這樣執行config時候就會換為這些工具了:

export CC=/opt/openwrt-toolchain/mips/bin/mips-openwrt-linux-gcc
export CPP=/opt/openwrt-toolchain/mips/bin/mips-openwrt-linux-g++
export AR=/opt/openwrt-toolchain/mips/bin/mips-openwrt-linux-ar
export LD=/opt/openwrt-toolchain/mips/bin/mips-openwrt-linux-ld
export RANLIB=/opt/openwrt-toolchain/mips/bin/mips-openwrt-linux-ranlib

因為是使用export匯入環境變數,所以關閉會話視窗後就失效了,所以不用考慮修改回來。設定好環境變數後可以輸入$CC -v檢查一下。

之後同方法一的config配置一樣

./config no-asm shared --prefix=/usr/local/mips

配置好之後還要修改Makefile,這一次只需要查詢全文刪掉-m64關鍵字即可。

3、編譯

注意:編譯的時候可能還需要設定STAGING_DIR變數。

export STAGING_DIR=/opt/openwrt-toolchain/mips/

然後可以執行make

make

列印以下資訊即表示編譯成功:

...
making all in tools...
make[1]: Entering directory `/opt/openssl-1.0.2d/tools'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/opt/openssl-1.0.2d/tools'

然後可以在根目錄下看到動態庫libcrypto.solibcrypto.so.1.0.0libssl.solibssl.so.1.0. 和靜態庫libcrypto.alibssl.a

安裝:

sudo make install

最後列印資訊如下表示安裝成功:

cp libcrypto.pc /usr/local/mips/lib/pkgconfig
chmod 644 /usr/local/mips/lib/pkgconfig/libcrypto.pc
cp libssl.pc /usr/local/mips/lib/pkgconfig
chmod 644 /usr/local/mips/lib/pkgconfig/libssl.pc
cp openssl.pc /usr/local/mips/lib/pkgconfig
chmod 644 /usr/local/mips/lib/pkgconfig/openssl.pc

4、引用

以後需要引用,修改如下配置即可

libssl 和 libcrypto 庫路徑:/usr/local/mips/lib/

$ ls /usr/local/mips/lib/
engines      libcrypto.so        libssl.a   libssl.so.1.0.0
libcrypto.a  libcrypto.so.1.0.0  libssl.so  pkgconfig

標頭檔案路徑:/usr/local/mips/include/

$ ls /usr/local/mips/include/openssl/
aes.h       cmac.h      dso.h     hmac.h      obj_mac.h      rand.h       ssl23.h      ui.h
asn1.h      cms.h       dtls1.h   idea.h      ocsp.h         rc2.h        ssl2.h       whrlpool.h
asn1_mac.h  comp.h      ebcdic.h  krb5_asn.h  opensslconf.h  rc4.h        ssl3.h       x509.h
asn1t.h     conf_api.h  ecdh.h    kssl.h      opensslv.h     ripemd.h     ssl.h        x509v3.h
bio.h       conf.h      ecdsa.h   lhash.h     ossl_typ.h     rsa.h        stack.h      x509_vfy.h
blowfish.h  crypto.h    ec.h      md4.h       pem2.h         safestack.h  symhacks.h
bn.h        des.h       engine.h  md5.h       pem.h          seed.h       tls1.h
buffer.h    des_old.h   e_os2.h   mdc2.h      pkcs12.h       sha.h        ts.h
camellia.h  dh.h        err.h     modes.h     pkcs7.h        srp.h        txt_db.h
cast.h      dsa.h       evp.h     objects.h   pqueue.h       srtp.h       ui_compat.h