2014-06-13 81 views
4

我正在尝试为Compiling the latest OpenSSL for Android构建适用于Android的最新OpenSSL。我设法建立静态库。如何将OpenSSL构建为未版本化的Android共享库?

但是我尝试编译共享库。这样做我运行:

./Configure android-armv7 shared 

这编译。问题是,这会创建一个版本化的lib,如libssl.so.1.0.0,这不受Android的支持。只是重命名不会执行,因为SONAME仍然指向版本化的文件名。

我遇到的另一个问题是当试图为旧的armeabi平台创建库时。当我运行时:

./Configure android shared 

它为旧的armeabi plattform创建静态库,但共享库却是arm-v7架构。

回答

4

如何将OpenSSL构建为未版本化的共享库(适用于Android)?

有很多,因为它是一个交叉编译。您应该从这里开始(它的OpenSSL wiki):OpenSSL and Android


但是我尝试编译共享库。要做到这一点我运行:

的./configure Android的ARMv7的共享

好了,你缺少了一些东西。至少,你应该使用Android NDK。这是AOSP的要求。由于使用非NDK工具,这些年来我看到了一些小问题。

我相信你需要设置下列环境变量。这是一个OpenSSL要求。

  • 86:

    • export MACHINE=i686
    • export RELEASE=2.6.37
    • export SYSTEM=android
    • export ARCH=x86
    • export CROSS_COMPILE="i686-linux-android-"
  • ARM:

    • export MACHINE=armv7
    • export RELEASE=2.6.37
    • export SYSTEM=android
    • export ARCH=arm
  • 这两种:

    • export ANDROID_DEV="$ANDROID_NDK_ROOT/platforms/$_ANDROID_API/$_ANDROID_ARCH/usr"
    • export HOSTCC=gcc

ANDROID_DEV将评估为类似/opt/android-ndk-r9/platforms/android-14/arch-arm/usr

您需要提供编译至少一个文件的输出。但我希望你缺少--sysroot了。到--sysroot的参数将会像/opt/android-ndk-r9/platforms/android-14/arch-arm

我会建议您按照OpenSSL and Android的说明。指示告诉你做的第一件事就是运行setenv-android.sh设置适当的变量。


这里就是我的跑看起来像使用OpenSSL and Android

$ cd openssl-1.0.1h 
$ . ./setenv-android.sh 
Error: FIPS_SIG does not specify incore module. Please edit this script. 
ANDROID_NDK_ROOT: /opt/android-ndk-r9 
ANDROID_EABI: arm-linux-androideabi-4.6 
ANDROID_API: android-14 
ANDROID_SYSROOT: /opt/android-ndk-r9/platforms/android-14/arch-arm 
ANDROID_TOOLCHAIN: /opt/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin 
FIPS_SIG: 
CROSS_COMPILE: arm-linux-androideabi- 
ANDROID_DEV: /opt/android-ndk-r9/platforms/android-14/arch-arm/usr 

$ ./config shared no-ssl2 no-ssl3 no-comp no-engines no-hw no-psk no-srp 
Operating system: armv7-whatever-android 
Configuring for android-armv7 
Configuring for android-armv7 
    no-comp   [option] OPENSSL_NO_COMP (skip dir) 
    no-ec_nistp_64_gcc_128 [default] OPENSSL_NO_EC_NISTP_64_GCC_128 (skip dir) 
    no-engines  [option] OPENSSL_NO_ENGINES (skip dir) 
    ... 
    no-srp   [option] OPENSSL_NO_SRP (skip dir) 
    no-ssl2   [option] OPENSSL_NO_SSL2 (skip dir) 
    no-ssl3   [option] OPENSSL_NO_SSL3 (skip dir) 
    no-store  [experimental] OPENSSL_NO_STORE (skip dir) 
    no-zlib   [default] 
    no-zlib-dynamic [default] 
IsMK1MF=0 
CC   =gcc 
... 

$ make 
... 
arm-linux-androideabi-gcc -I. -I.. -I../include -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS 
-D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -march=armv7-a -mandroid 
-mfloat-abi=softfp -I/opt/android-ndk-r9/platforms/android-14/arch-arm/usr/include 
-B/opt/android-ndk-r9/platforms/android-14/arch-arm/usr/lib -Os -fomit-frame-pointer 
-Wall -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM 
-DAES_ASM -DGHASH_ASM -c -o cryptlib.o cryptlib.c 
... 

可以忽略Error: FIPS_SIG does not specify incore module...因为你不是 FIPS建立一个广阔的图书馆。


...无版本的共享库(Android版)?

这将会给你带来麻烦。我相信这样做的方式是提供各地的静态库的包装,并使用您的包装作为替代。所以,你从来不使用OpenSSL的共享对象,和版本没有关系。

的问题是你的过程将受精卵叉。受精卵已经映射到其空间的OpenSSL 0.9.8e。所以,当受精卵叉子你的过程,你的过程将已经0.9.8e和​​共享对象在你的APK 不会映射。您只需使用现有的OpenSSL。这将导致模糊的问题。


我也相信OpenSSL的Configure有bug。首先,配置丢失-mfloat-abi=softfp。这是AOSP的要求。其次,使用-O3而不是-Os。这是对资源受限设备的移动需求。

您可能想要打开Makefile并在配置后进行更改。我在建图书馆之前也这样做。

+0

THX很多关于你的答案。我同意你关于OpenSSL的与共享库相关的配置错误的假设。当我找到时间时,我必须尝试。 – tmanthey

7

作为构建版本少libcrypto,覆盖CALC_VERSIONS是卓有成效的(至少对于1.0.2d):

make CALC_VERSIONS="SHLIB_COMPAT=; SHLIB_SOVER=" all 

然后,子目标靶install_swlink-shared必须停用(否则破坏的符号链接覆盖这些库),这可以通过在合适的位置创建一个同名的虚拟文件来完成(此外,SHLIB_EXT也必须设置为复制无版本文件)。

完整的bash脚本我用:

ORIG_PATH=$PATH 
SCRIPT_PATH=$(dirname $(readlink -f $0)) 

tar -zxf $SCRIPT_PATH/openssl-fips-2.0.10.tar.gz 
tar -zxf $SCRIPT_PATH/openssl-1.0.2d.tar.gz 

ANDROID_NDK_PATH=<system-specific-path>/android-ndk-r10e-linux 
ANDROID_API=android-14 
ANDROID_SYSROOT=$ANDROID_NDK_PATH/platforms/$ANDROID_API/arch-arm 
export OPENSSLDIR=$SCRIPT_PATH/ssl/android/arm 
export FIPSDIR=$OPENSSLDIR/fips-2.0 
export HOSTCC=gcc 
export FIPS_SIG=$SCRIPT_PATH/openssl-fips-2.0.10/util/incore 
export ANDROID_DEV=$ANDROID_SYSROOT/usr 
export PATH=$ANDROID_NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$ORIG_PATH 
export MACHINE=armv7 
export RELEASE=2.6.37 
export SYSTEM=android 
export ARCH=arm 
export CROSS_COMPILE=arm-linux-androideabi- 

cd $SCRIPT_PATH/openssl-fips-2.0.10 
./config shared 
make clean 
make 
make install_sw 

cd $SCRIPT_PATH/openssl-1.0.2d 
./config fips shared -no-sslv2 -no-sslv3 -no-comp -no-hw -no-engines --openssldir=$OPENSSLDIR --with-fipsdir=$FIPSDIR --with-fipslibdir=$FIPSDIR/lib/ 
make clean 
make depend 
make CALC_VERSIONS="SHLIB_COMPAT=; SHLIB_SOVER=" MAKE="make -e" all 
mkdir -p $OPENSSLDIR/lib 
echo "place-holder make target for avoiding symlinks" >> $OPENSSLDIR/lib/link-shared 
make SHLIB_EXT=.so install_sw 
rm $OPENSSLDIR/lib/link-shared 

然后没有生成的目标文件应该有或引用版本使名称:

$ readelf -d ssl/android/arm/lib/libcrypto.so | grep 'SONAME\|NEEDED' 
0x00000001 (NEEDED)      Shared library: [libdl.so] 
0x00000001 (NEEDED)      Shared library: [libc.so] 
0x0000000e (SONAME)      Library soname: [libcrypto.so] 
$ readelf -d ssl/android/arm/lib/libssl.so | grep 'SONAME\|NEEDED' 
0x00000001 (NEEDED)      Shared library: [libcrypto.so] 
0x00000001 (NEEDED)      Shared library: [libdl.so] 
0x00000001 (NEEDED)      Shared library: [libc.so] 
0x0000000e (SONAME)      Library soname: [libssl.so] 
$ readelf -d ssl/android/arm/bin/openssl | grep 'SONAME\|NEEDED' 
0x00000001 (NEEDED)      Shared library: [libssl.so] 
0x00000001 (NEEDED)      Shared library: [libcrypto.so] 
0x00000001 (NEEDED)      Shared library: [libdl.so] 
0x00000001 (NEEDED)      Shared library: [libc.so] 
相关问题