之前在網上找了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