如何将OpenSSL构建为Android的无版本共享库?

tma*_*hey 5 android openssl shared-libraries cross-compiling

我正在尝试在编译最新的OpenSSL for Android之后构建最新的OpenSSL for Android.我设法构建静态库.

但是我尝试编译共享库.为此,我运行:

./Configure android-armv7 shared
Run Code Online (Sandbox Code Playgroud)

这编译.问题是,这会创建一个像libssl.so.1.0.0这样的版本化lib,Android不支持它.只是重命名不起作用,因为SONAME仍然指向版本化文件名.

我遇到的不同问题是在尝试为旧的armeabi平台创建库时.当我跑:

./Configure android shared
Run Code Online (Sandbox Code Playgroud)

它为旧的armeabi平台创建了静态库,但共享库却是arm-v7架构.

Loi*_*oic 9

至于构建无版本libcrypto,覆盖CALC_VERSIONS就可以了(至少对于1.0.2d):

make CALC_VERSIONS="SHLIB_COMPAT=; SHLIB_SOVER=" all
Run Code Online (Sandbox Code Playgroud)

然后,子目标link-shared的目标install_sw必须停用(否则破碎的符号链接覆盖库),其可通过在合适的地方创建相同的名称的虚拟文件进行(另外,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
Run Code Online (Sandbox Code Playgroud)

那么没有生成的目标文件应该具有或引用版本化的so-name:

$ 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]
Run Code Online (Sandbox Code Playgroud)


jww*_*jww 4

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

它有很多内容,因为它是交叉编译的。您可能应该从这里开始(它是 OpenSSL wiki):OpenSSL 和 Android


不过我尝试编译共享库。为此,我运行:

./配置android-armv7共享

好吧,所以你错过了一些东西。至少,您应该使用 Android NDK。这是 AOSP 的要求。多年来,由于使用非 NDK 工具,我遇到了许多小问题。

我相信您需要设置以下环境变量。这是 OpenSSL 的要求。

  • x86:

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

    • 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 和 Android上的说明。说明告诉您要做的第一件事是运行setenv-android.sh以设置正确的变量。


这是我使用OpenSSL 和 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
...
Run Code Online (Sandbox Code Playgroud)

您可以忽略,Error: FIPS_SIG does not specify incore module...因为您没有构建支持 FIPS 的库。


...无版本共享库(适用于 Android)?

这可能会给你带来麻烦。我相信做到这一点的方法是在静态库周围提供一个包装器,并使用您的包装器作为代理。因此,您永远不会使用 OpenSSL 共享对象,并且版本控制并不重要。

问题是你的进程将从 Zygote 分叉。Zygote 已经将 OpenSSL 0.9.8 映射到其空间中。因此,当 Zygote forks 为您的进程时,您的进程将已经有 0.9.8,并且您的 APK 中的共享对象将不会被映射。您只需使用现有的 OpenSSL。这将导致一些难以理解的问题。


我还相信 OpenSSL 中存在错误Configure。首先,配置缺失-mfloat-abi=softfp。这是 AOSP 的要求。其次,-O3使用的是而不是-Os。这是资源受限设备上的移动要求。

您可能需要Makefile在配置后打开并进行更改。在构建库之前我也会做同样的事情。