You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenSSH 9.3p编译Android版本失败的问题及解决求助

问题

尝试为Android平台编译OpenSSH 9.3p版本,操作步骤如下:

export ANDROID_NDK_ROOT=$ANDROID_HOME/ndk/21.0.6113669
export PATH=$PATH:$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin
cd ~/src

git clone git@github.com:openssh/openssh-portable.git
cd github-portable
git checkout V_9_3_P1
mkdir -p build/android-arm
autoreconf
# 临时编译不含zlib和openssl的精简版本
CHOST="arm-linux-androideabi" \
  CHOST2="armv7a-linux-androideabi17" \
  CC="${CHOST2}-clang" \
  CXX="${CHOST2}-clang++" \
  CFLAGS="-DHAVE_ATTRIBUTE__SENTINEL__=1" \
  CXXFLAGS="-DHAVE_ATTRIBUTE__SENTINEL__=1" \
  RANLIB="${CHOST}-ranlib" \
  LD="${CHOST}-ld" \
  AR="${CHOST}-ar" \
  ARFLAGS="cr" \
  CHOST="${CHOST}" \
  ./configure --host=arm-linux-androideabi --with-libs --without-zlib --without-openssl --prefix=$PWD/build/android-arm
make ssh

其中CFLAGS和CXXFLAGS是用于解决另一编译问题的临时方案。编译时出现NDK头文件不兼容错误,具体错误信息:

armv7a-linux-androideabi26-clang -DHAVE_ATTRIBUTE__SENTINEL__=1 -pipe -Wunknown-warning-option -Qunused-arguments -Wall -Wpointer-arith -Wuninitialized -Wsign-compare -Wformat-security -Wsizeof-pointer-memaccess -Wno-pointer-sign -Wno-unused-result -Wimplicit-fallthrough -fno-strict-aliasing -mretpoline -D_FORTIFY_SOURCE=2 -ftrapv -fno-builtin-memset -fstack-protector-strong   -fPIC -I. -I.. -I. -I./..  -DHAVE_CONFIG_H -c bsd-misc.c
bsd-misc.c:392:7: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
bzero(void *b, size_t n)
      ^
bsd-misc.c:392:16: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
bzero(void *b, size_t n)
               ^
bsd-misc.c:392:1: error: at most one overload for a given name may lack the 'overloadable' attribute
bzero(void *b, size_t n)
^
/home/user149408/tools/android-sdk-linux_86/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/include/strings.h:61:23: note: expanded from macro 'bzero'
#define bzero(b, len) __bionic_bzero((b), (len))
                      ^
/home/user149408/tools/android-sdk-linux_86/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/include/strings.h:62:40: note: previous unmarked overload of function is here
static __inline__ __always_inline void __bionic_bzero(void* b, size_t len) {
                                       ^
bsd-misc.c:392:7: error: parameter name omitted
bzero(void *b, size_t n)
      ^
bsd-misc.c:392:16: error: parameter name omitted
bzero(void *b, size_t n)
               ^
bsd-misc.c:394:15: error: use of undeclared identifier 'b'
        (void)memset(b, 0, n);
                     ^
bsd-misc.c:394:21: error: use of undeclared identifier 'n'
        (void)memset(b, 0, n);
                           ^
2 warnings and 5 errors generated.
make[1]: *** [Makefile:106: bsd-misc.o] Error 1
make[1]: Leaving directory '/home/user149408/src/openssh-portable/openbsd-compat'
make: *** [Makefile:199: openbsd-compat/libopenbsd-compat.a] Error 2

该版本在Ubuntu 22.04 x86_64本地编译正常,询问问题原因及解决方法。

问题原因

  1. 宏冲突与函数重定义:Android NDK的strings.h中已将bzero定义为宏,展开为__bionic_bzero内联函数。而OpenSSH的bsd-misc.c中自行实现了bzero函数,编译时宏展开后,用户定义的bzero变成对__bionic_bzero的重定义,违反Clang的重载规则,引发冲突。
  2. 隐式类型声明连锁错误:宏展开破坏了原bzero函数的声明结构,编译器无法识别正确返回值类型,默认当作int处理,进而引发参数未声明等后续错误。

解决方法

方法一:编译时禁用NDK的bzero宏

修改CFLAGS添加-Ubzero参数,强制取消bzero宏定义,让编译器使用OpenSSH自带的实现,修改后的配置命令如下:

CHOST="arm-linux-androideabi" \
  CHOST2="armv7a-linux-androideabi17" \
  CC="${CHOST2}-clang" \
  CXX="${CHOST2}-clang++" \
  CFLAGS="-DHAVE_ATTRIBUTE__SENTINEL__=1 -Ubzero" \
  CXXFLAGS="-DHAVE_ATTRIBUTE__SENTINEL__=1" \
  RANLIB="${CHOST}-ranlib" \
  LD="${CHOST}-ld" \
  AR="${CHOST}-ar" \
  ARFLAGS="cr" \
  CHOST="${CHOST}" \
  ./configure --host=arm-linux-androideabi --with-libs --without-zlib --without-openssl --prefix=$PWD/build/android-arm

重新执行make ssh即可。

方法二:修改OpenSSH的bzero实现

直接编辑openbsd-compat/bsd-misc.c文件,在自定义bzero函数定义前添加宏取消指令:

#undef bzero
void
bzero(void *b, size_t n)
{
        (void)memset(b, 0, n);
}

保存文件后重新执行make ssh。

方法三:让configure自动适配系统bzero

若允许依赖系统库,可去掉--without-zlib --without-openssl限制;或尝试添加--enable-builtin-bzero=no参数(若OpenSSH configure支持该选项),重新运行autoreconf后执行配置,让脚本自动检测Android系统已有的bzero实现,跳过自带版本的编译。


内容的提问来源于stack exchange,提问作者user149408

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:45:30