为64位Android构建OpenSSL 1.0.2n,NDK r16b未定义对bsd_signal的引用

时间:2018-03-16 00:52:15

标签: android android-ndk openssl

我试图使用最新的Android NDK r16b来构建OpenSSL 1.0.2n。构建32位archs(armv7,x86)工作正常,但是当我尝试构建64位archs(arm64,x86_64)时,我收到一个链接器错误,指出bsd_signal未定义:

shlib_target=; if [ -n "libcrypto.so.1.0.0 libssl.so.1.0.0" ]; then \
        shlib_target="linux-shared"; \
    elif [ -n "" ]; then \
      FIPSLD_CC="aarch64-linux-android-gcc"; CC=/usr/local/ssl/fips-2.0/bin/fipsld; export CC FIPSLD_CC; \
    fi; \
    LIBRARIES="-L.. -lssl  -L.. -lcrypto" ; \
    /Applications/Xcode.app/Contents/Developer/usr/bin/make -f ../Makefile.shared -e \
        APPNAME=openssl OBJECTS="openssl.o verify.o asn1pars.o req.o dgst.o dh.o dhparam.o enc.o passwd.o gendh.o errstr.o ca.o pkcs7.o crl2p7.o crl.o rsa.o rsautl.o dsa.o dsaparam.o ec.o ecparam.o x509.o genrsa.o gendsa.o genpkey.o s_server.o s_client.o speed.o s_time.o apps.o s_cb.o s_socket.o app_rand.o version.o sess_id.o ciphers.o nseq.o pkcs12.o pkcs8.o pkey.o pkeyparam.o pkeyutl.o spkac.o smime.o cms.o rand.o engine.o ocsp.o prime.o ts.o srp.o" \
        LIBDEPS=" $LIBRARIES -ldl" \
        link_app.${shlib_target}
req.o: In function `req_main':
req.c:(.text+0x368): undefined reference to `bsd_signal'
ca.o: In function `ca_main':
ca.c:(.text+0xe90): undefined reference to `bsd_signal'
ecparam.o: In function `ecparam_main':
ecparam.c:(.text+0x30): undefined reference to `bsd_signal'
s_server.o: In function `s_server_main':
s_server.c:(.text+0x32c0): undefined reference to `bsd_signal'
pkcs12.o: In function `pkcs12_main':
pkcs12.c:(.text+0x1134): undefined reference to `bsd_signal'
cms.o:cms.c:(.text+0x98): more undefined references to `bsd_signal' follow
collect2: error: ld returned 1 exit status

我看到NDK在某一点上已经省略了bsd_signal,但它被添加回NDK 13(https://github.com/android-ndk/ndk/issues/160)。此外,如果它完全丢失,我会期望32位版本也会失败。

以下是我试图用于arm64构建的配置(这实际上是用脚本完成的,这很长。为了避免在这里粘贴整个废话,这些是最终被使用的值当它被执行时):

export MACHINE=armv7
export ARCH=arm64
export CROSS_COMPILE="aarch64-linux-android-"
export ANDROID_SYSROOT="$ANDROID_NDK_ROOT/platforms/android-21/arch-arm64"
export SYSROOT="$ANDROID_SYSROOT"
export NDK_SYSROOT="$ANDROID_SYSROOT"
export ANDROID_NDK_SYSROOT="$ANDROID_SYSROOT"
export ANDROID_API=android-21

export ANDROID_DEV="$ANDROID_NDK_ROOT/platforms/android-21/arch-arm64/usr"
export HOSTCC=gcc
export ANDROID_TOOLCHAIN="$ANDROID_NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin"
export PATH="$ANDROID_TOOLCHAIN":"$PATH"

./Configure shared no-ssl2 no-ssl3 no-comp no-hw no-engine linux-generic64 --openssldir=/usr/local/ssl/android-21 -fPIE -D__ANDROID_API__=android-21 -I$ANDROID_NDK_ROOT/sysroot/usr/include -I$ANDROID_NDK_ROOT/sysroot/usr/include/aarch64-linux-android -B$ANDROID_NDK_ROOT/platforms/android-21/arch-arm64/usr/lib

make clean
make CALC_VERSIONS="SHLIB_COMPAT=; SHLIB_SOVER=" depend
make CALC_VERSIONS="SHLIB_COMPAT=; SHLIB_SOVER=" all

我已经尝试了很多不同的事情,我甚至无法开始列出它们。

任何人都能看到我在这里失踪的东西?

2 个答案:

答案 0 :(得分:2)

  1. 我建议使用Android NDK附带的 make 来使用NDK工具链进行构建。如果它不在您的PATH上,您可以在

    找到它
    $ANDROID_NDK_ROOT/prebuilt/darwin-x86_64/bin/make
    

    我不认为这是你问题的真正原因。

  2. bsd_signal platforms/android-21/arch-arm/usr/lib/libc.so以及相应的libc.a导出,但不是从platforms/android-21/arch-arm64/usr/lib/libc.so导出。

  3. 统一标头中标记为 __REMOVED_IN(21) ,因此我希望编译器发出有关使用未定义函数的警告。

  4. 可能的解决方法是提供虚拟bsd_signal,因为 Felipe Cavalcanti 建议on GitHub

  5. bsd_signal 的问题似乎已在openssl 1.1系列中得到解决。

  6. 您在命令行上出错:请改用 -D__ANDROID_API__=21

答案 1 :(得分:0)

这绝对看起来像是针对一个API级别构建并与另一个API级别链接(或者标题ABI与库ABI的不匹配?)。要排除任何配置问题(即使它没有解决问题,也只是简单地构建),我建议使用standalone toolchain