openssl靜態庫交叉編譯後能使用,支持ndk工具鏈編譯安卓版本

之前在網上找了openssl的交叉編譯方法,都是./config no-asm shared --prefix=xxx,然後改下makefile中的編譯工具前綴,接着make & make install,這樣可以編譯成功,但我的程序鏈接openssl靜態庫之後運行,在ssl握手的時候會發生decode error(抓包看出來的),一直找不到解決方法。

昨天,通過一個友商同事的幫助,他提供了他們編譯openssl的makefile,我用他們的makefile編譯出來的靜態庫就正常了,我對比後抽出了關鍵的不同處,重新再編譯一次,也能夠正常運行:

./Configure --prefix=/root/openssl-1.0.2p/install_dir shared no-asm linux-generic32

生成makefile後同樣進入makefile修改編譯工具前綴再make。

也可以直接使用下面的cross_openssl_makefile:

###放到openssl目錄下,make -f cross_openssl_makefile CROSS_PREFIX=xxx CROSS_PLATFORM=xxx
###CROSS_PLATFORM一般有linux-mips32 linux-generic32 linux-x86_64

OPENSSL_NO_CIPHERS=no-idea no-md2 no-mdc2 no-rc5 no-sha0 no-smime no-rmd160 no-aes192 no-ripemd no-camellia no-ans1 no-krb5
OPENSSL_OPTIONS=shared no-err no-hw no-zlib no-sse2
INSTALL_DIR=$(shell pwd)/install_dir
#CROSS_PREFIX=mipsel-linux
#CROSS_PLATFORM=linux-mips32
OPENSSL=$(shell pwd)

.PHONY:all build config_a
all: build

config_a:
	./Configure --cross-compile-prefix=$(CROSS_PREFIX)- --prefix=$(INSTALL_DIR) --openssldir=$(INSTALL_DIR)/etc/ssl -ldl $(OPENSSL_NO_CIPHERS) $(OPENSSL_OPTIONS) $(CROSS_PLATFORM)

build: config_a
	echo DIR=$(INSTALL_DIR)
	make -C $(OPENSSL) MAKEDEPPROG=$(CROSS_PREFIX)-gcc depend
	make -C $(OPENSSL) CC=$(CROSS_PREFIX)-gcc AR="$(CROSS_PREFIX)-ar r" RANLIB=$(CROSS_PREFIX)-ranlib all
	make -C $(OPENSSL) CC=$(CROSS_PREFIX)-gcc AR="$(CROSS_PREFIX)-ar r" RANLIB=$(CROSS_PREFIX)-ranlib build-shared
	make -C $(OPENSSL) CC=$(CROSS_PREFIX)-gcc do_linux-shared
	make -C $(OPENSSL) CC=$(CROSS_PREFIX)-gcc install

不清楚是不是因爲加了平臺類型linux-generic32的原因,這個暫時還沒時間去驗證,在此做下記錄,也希望能夠幫助碰到困難的同學。

我的程序是在路由器上跑的,包含了arm、mips、x86、x64架構,系統爲openwrt

------------------------------------------------------------------------------------------------------------------------------------------

#創建獨立的工具鏈,纔可用cross_openssl_makefile編譯,--arch可以是'arm', 'arm64', 'mips', 'mips64', 'x86', 'x86_64',
/root/android-ndk-r14b/build/tools/make-standalone-toolchain.sh --install-dir=/tmp/my-android-toolchain/arm  --arch=arm
make -f cross_openssl_makefile CROSS_PREFIX=arm-linux-androideabi CROSS_PLATFORM=android-armv7

安卓ndk編譯openssl,先把ndk工具鏈獨立出來,像其他交叉編譯工具一樣,使用cross_openssl_makefile可以編譯出來

arm64的CROSS_PLATFORM=linux-aarch64

mips64的CROSS_PLATFORM=linux-mips64

x86_64的CROSS_PLATFORM=linux-x86_64 

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