用NDK r16b编译64位Android版OpenSSL 1.0.2n遇bsd_signal未定义错误
解决OpenSSL 1.0.2n在Android NDK r16b 64位架构下的bsd_signal未定义错误
你遇到的链接错误核心原因是目标架构配置混淆和未使用Android专用编译目标,导致OpenSSL尝试调用Android 64位libc中不兼容的信号函数。以下是具体的解决步骤:
1. 修正环境变量中的架构矛盾
你当前设置了MACHINE=armv7但ARCH=arm64,这会让OpenSSL的配置脚本误判目标平台,错误加载32位的信号处理逻辑,最终在64位链接时找不到符号。修正环境变量:
# 移除错误的MACHINE设置,或设置为对应64位架构(可选,OpenSSL会通过ARCH自动识别) # export MACHINE=arm64 export ARCH=arm64 export CROSS_COMPILE="aarch64-linux-android-" export ANDROID_NDK_ROOT=/path/to/your/ndk/r16b export ANDROID_SYSROOT="$ANDROID_NDK_ROOT/platforms/android-21/arch-arm64" export ANDROID_API=21 export ANDROID_TOOLCHAIN="$ANDROID_NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin" export PATH="$ANDROID_TOOLCHAIN:$PATH" export HOSTCC=gcc
2. 使用Android专用编译目标替代通用Linux目标
你之前用的linux-generic64没有针对Android的bionic libc做适配,而OpenSSL 1.0.2已经提供了android-arm64(对应arm64)和android-x86_64(对应x86_64)的专用编译目标,这些目标会自动处理Android特有的宏定义,避免依赖bsd_signal。
修正后的Configure命令:
./Configure shared no-ssl2 no-ssl3 no-comp no-hw no-engine android-arm64 \ --openssldir=/usr/local/ssl/android-21 \ -fPIE -D__ANDROID_API__=$ANDROID_API \ --sysroot=$ANDROID_SYSROOT
3. 简化编译参数,避免头文件路径冲突
你之前添加的-I$ANDROID_NDK_ROOT/sysroot/usr/include/aarch64-linux-android已经被--sysroot参数覆盖,重复添加可能导致头文件查找优先级混乱,反而引入错误的函数声明。使用上面的简化命令即可。
4. 执行编译
保持你的make命令不变,重新执行:
make clean make CALC_VERSIONS="SHLIB_COMPAT=; SHLIB_SOVER=" depend make CALC_VERSIONS="SHLIB_COMPAT=; SHLIB_SOVER=" all
针对x86_64架构的适配
如果是编译x86_64,只需要调整对应的环境变量和编译目标:
export ARCH=x86_64 export CROSS_COMPILE="x86_64-linux-android-" export ANDROID_SYSROOT="$ANDROID_NDK_ROOT/platforms/android-21/arch-x86_64" export ANDROID_TOOLCHAIN="$ANDROID_NDK_ROOT/toolchains/x86_64-linux-android-4.9/prebuilt/darwin-x86_64/bin" ./Configure shared no-ssl2 no-ssl3 no-comp no-hw no-engine android-x86_64 \ --openssldir=/usr/local/ssl/android-21-x86_64 \ -fPIE -D__ANDROID_API__=$ANDROID_API \ --sysroot=$ANDROID_SYSROOT
额外排查:强制禁用bsd_signal
如果上述步骤仍有问题,可以手动添加-DNO_BSD_SIGNAL参数,强制OpenSSL不使用bsd_signal,改用Android兼容的sigaction:
./Configure shared no-ssl2 no-ssl3 no-comp no-hw no-engine android-arm64 \ --openssldir=/usr/local/ssl/android-21 \ -fPIE -D__ANDROID_API__=$ANDROID_API \ --sysroot=$ANDROID_SYSROOT \ -DNO_BSD_SIGNAL
内容的提问来源于stack exchange,提问作者Jordan




