为 Android 构建 OpenSSH

Posted

技术标签:

【中文标题】为 Android 构建 OpenSSH【英文标题】:Building OpenSSH for Android 【发布时间】:2020-08-10 13:31:18 【问题描述】:

注意:我浏览了大多数其他帖子,它们都使用旧版本的 NDK,这不适合我的用例。

我想 8.2。这是我为构建 zlib、OpenSSL 和最后的 OpenSSH 而编写的脚本。不幸的是,这似乎在决赛中失败了make

#!/bin/bash

# set android_NDK_HOME
export ANDROID_NDK_HOME="/opt/android-ndk-r21b"

# add the toolchain to our path
export PATH="$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH"

# nb. for x86 set CHOST="i686-linux-android"
export CHOST="arm-linux-androideabi"
export CHOST2="armv7a-linux-androideabi29"
export CC="$CHOST2-clang"
export CXX="$CHOST2-clang++"
export RANLIB="$CHOST-ranlib"
export LD="$CHOST-ld"
export AR="$CHOST-ar"
export ARFLAGS="cr"
export CHOST="$CHOST"

# Build zlib
wget http://zlib.net/zlib-1.2.11.tar.gz
tar zxf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure
make
cd ..

# Build OpenSSL
wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz
tar zxf openssl-1.1.1g.tar.gz
cd openssl-1.1.1g
./Configure android-arm -D__ANDROID_API__=29
make
cd ..

# Build OpenSSH
#wget https://mirror.csclub.uwaterloo.ca/pub/OpenBSD/OpenSSH/portable/openssh-8.2p1.tar.gz
tar zxf openssh-8.2p1.tar.gz
cd openssh-8.2p1

./configure --host=arm-linux-androideabi --target=arm-linux-androideabi --with-libs --with-zlib=../zlib-1.2.11 --with-ssl-dir=../openssl-1.1.1g --disable-etc-default-login

make ssh

make ssh 命令中,构建失败并显示:

make[1]: Entering directory '/home/edouard/ki4a_deps/openssh-8.2p1/openbsd-compat'
armv7a-linux-androideabi29-clang -g -O2 -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./.. -I/home/edouard/ki4a_deps/openssh-8.2p1/../openssl-1.1.1g/include -I../zlib-1.2.11  -DHAVE_CONFIG_H -c arc4random.c
In file included from arc4random.c:34:
/opt/android-ndk-r21b/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/include/unistd.h:107:20: error: expected ')'
    __attribute__((__sentinel__(1)));

这很奇怪,因为据我通过谷歌搜索得知,clang 确实支持__sentinel__。我做错了什么?

【问题讨论】:

github.com/android/ndk/issues/1362 这似乎是关于同一问题的错误报告。我可以通过将 CFLAGS 和 CXXFLAGS 导出到“-DHAVE_ATTRIBUTE__SENTINEL__=1”来解决这个问题。尽管存在进一步的构建问题 【参考方案1】:

为 Android 构建 openssh 命令行二进制文件。 上游:

https://github.com/CyanogenMod/android_external_zlib.git -b cm-11.0
https://github.com/CyanogenMod/android_external_openssl.git -b cm-11.0
https://github.com/CyanogenMod/android_external_openssh.git -b cm-11.0

更多信息在: https://github.com/shmilee/android-cli-openssh

【讨论】:

以上是关于为 Android 构建 OpenSSH的主要内容,如果未能解决你的问题,请参考以下文章

为 Android 构建 QtLocation 模块

Android - 为不同的处理器架构构建单独的 APK

在 Eclipse 中构建 Android 项目 android.support 无法解析为类型

使用 librtmp 为 android 构建 FFMPEG

使用 androiddeployqt 为 android 构建 Qt 应用程序时出现 Gradle 构建错误

为 Android 构建 MUPDF