cross compile openssl

最近的項目需求中依賴libcrypto和libssl庫,因此須要編譯安裝openssl0.9.8e,花了差很少一天的時間終於成功安裝和裁剪,如今總結並分享我的的方法,貼出來供你們參考和指正。python

方法以下(不一樣的平臺要根據實際環境更改相應的編譯工具):linux

1、配置:算法

./config no-asmshared--prefix=/repo/root/TEST_PACKAGES/robot/PACKAGESbash

說明:no-asm  在交叉編譯過程當中不使用匯編代碼代碼加速編譯過程。ide

shared  生成動態連接庫。函數

 
--prefix      指定生成lib include bin目錄的路徑,不修改此項則默認爲OPENSSLDIR目錄。 工具

2、 修改Makefile:idea

(這些修改也能夠在config配置中使用相應參數來更改,具體怎麼作請本身查相應資料,我是直接修改Makefile的)spa

在Makefile中找到相應參數,其後面的內容修改以下:.net

一、 PLATFORM=(mips) //注意修改此值爲你產品硬件平臺,如arm、mips等等,我所使用的平臺爲mips,我使用的是mips平臺編譯工具。

二、把全部的 –march=pentium 去掉(三處)。

三、指定所使用的編譯工具:(下面配置要嚴格一致,不然make會報錯)

CC= mipsel-linux-gcc

#CFLAG= -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -m486 -Wall -Wuninitialized -DSHA1_ASM -DMD5_ASM -DRMD160_ASM
CFLAG= -fPIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DOPENSSL_NO_KRB5 -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall

DEPFLAG=
PEX_LIBS=
EX_LIBS= -ldl
EXE_EXT=
ARFLAGS=
PERL= /usr/bin/perl
AR=mipsel-linux-ar $(ARFLAGS) r
RANLIB= mipsel-linux-ranlib
TAR= tar
TARFLAGS= --no-recursion
MAKEDEPPROG= gcc

說明:

一、此處的mipsel-linux-gcc爲交叉編譯工具,根據實際狀況更改成你本身平臺下的編譯工具便可,好比:arm-linux-gcc。注意AR和RANLIB也要做相應修改。

二、不一樣平臺的編譯器編譯出來的庫文件大小可能不同。(我要兩種平臺下編譯出來的庫文件相差0.5M的大小)。

export PATH=$PATH:/home/charles/code/cross-compile/embedded-toolchain/tool-chain/bin
export LD_LIBRARY_PATH=/usr/local/gmp-4.3.2/lib:/usr/local/mpfr-2.4.2/lib:/usr/local/mpc-0.8.1/lib

3、make

4、make install

        以上操做成功後會在你指定的目錄下生成四個文件夾,在其中的lib目錄下可找到所須要的 XXX.so動態庫文件。

//check the result

# ls -l /repo/root/TEST_PACKAGES/robot/PACKAGES/lib | grep crypto
-rw-r--r--  1 root root  3387284 Jun  8 20:20 libcrypto.a
lrwxrwxrwx  1 root root       18 Jun  8 20:20 libcrypto.so -> libcrypto.so.1.0.0
-r-xr-xr-x  1 root root  2225683 Jun  8 20:20 libcrypto.so.1.0.0


# ldd /repo/root/TEST_PACKAGES/robot/PACKAGES/lib/libcrypto.so.1.0.0
        not a dynamic executable

# ldd /repo/root/TEST_PACKAGES/robot/PACKAGES/lib/libcrypto.so
        not a dynamic executable
//check

# export LD_LIBRARY_PATH=/repo/root/TEST_PACKAGES/robot/PACKAGES/lib

# /repo/root/TEST_PACKAGES/robot/PACKAGES/bin/python
Python 2.7.11 (default, May 25 2016, 07:17:40) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> import ssl
>>> import _hashlib
>>> import hashlib
>>>

5、裁剪

      在嵌入式平臺上,若是使用openssl的標準方法,編譯出來的libcrypto.so和libssl.so會比較大,大約爲2.1M多和436K,爲了節省空間,可使用以下方法進行裁剪:

       一、靜態庫:

./config--prefix=/home/zqjun/openssl5350 no-shared no-zlib no-asm no-threads no-sse2no-compno-dso no-gmp no-rfc3779 no-krb5 no-rc5 no-zlib-dynamic no-hw no-cipherno-md2 no-md4 no-mdc2 no-rc2 no-idea no-camellia no-ec no-ecdsa no-ecdhno-store no-ripemd no-des no-rc4 no-bf no-cast no-dsa no-dh no-ssl no-ssl2no-ssl3 no-tls no-perlasm

 

二、動態庫:

.config--prefic=/home/zqjun/openssl5350 shared no-zlib no-asm no-threads no-sse2 no-compno-gmp no-rfc3779 no-krb5 no-rc5 no-zlib-dynamic no-hw no-cipher no-md2 no-md4 no-mdc2no-rc2 no-idea no-camellia no-ec no-ecdsa no-ecdh no-store no-ripemd no-des no-rc4no-bf no-cast no-dsa no-dh no-ssl no-ssl2 no-ssl3 no-tls no-perlasm

注意:

一、動態編譯時不能出現no-dso參數,由於編譯過程當中有些函數須要連接相應動態庫。

二、編譯完成後使用XXX-strip把相應的符號去掉,安裝後的庫會更小一些。

建立出Makefile後,再按照上面編譯時的修改方法修改makefile中相應的參數值就能夠了。

 

注意事項:

一、在linux上用make編譯或用make install從新安裝以前最好先用makeclean清除上一次安裝所生成的全部的文件,以避免因以前的錯誤遺留的文件致使編譯安裝不成功。

       二、注意引用庫的順序爲:-lssl -lcrypto,若是爲-lcrypto –lssl,編譯時會出現錯誤。

       三、openssl所涉及到的算法介紹見博客:

              http://blog.csdn.net/guoliquan1/article/details/4703315

       四、參考書箱和文檔:《Openss安裝指南》《OpenSSL使用指南》。

相關文章
相關標籤/搜索