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 

你可能感兴趣的:(linux,网络开发,openssl)