如何为 ARM 交叉编译 OpenSSH?

Nat*_*man 5 android arm openssh cross-compiling android-ndk

我尝试使用 Android NDK 编译 OpenSSH,但失败了。

我的尝试包括以下步骤:

  1. 交叉编译 Android 版 OpenSSL 并安装头文件/库/home/me/arm

  2. 从这里获取 OpenSSH 6.2p1

  3. 提取存档并运行./configure

    ./configure --prefix=/home/me/arm \
            --host=arm-linux-androideabi \
            --with-ssl-dir=/home/me/arm

    ...这导致了以下错误:

    getrrsetbyname.c:166:2: 错误:未知类型名称“HEADER”
  4. 修改./configure命令以包括:

    ac_cv_search_getrrsetbyname=是

    ...这解决了一个问题,但仍然因另一个错误而中止:

    /usr/include/linux/un.h:17:8:错误:重新定义“struct sockaddr_un”
  5. 再次修改./configure命令以包括:

    ac_cv_header_sys_un_h=是

    ...这让我更进一步,但仍然因错误而中止:

    channels.c:在函数“channel_prepare_select”中:
    Channels.c:2143:2:警告:函数“howmany”的隐式声明
    [-W隐式函数声明]
    channels.c:2145:45:错误:'fd_mask'未声明(在此函数中首次使用)

现在我被困住了。我已经破解了 Androidsys/select.h并发现它fd_mask没有在任何地方定义。我也无法找到./configure解决此问题的选项。还有howmany()未定义的问题。

我需要进行哪些更改才能编译程序?


编辑:我现在已经取得了一些进展。我添加了以下行来./configure解决“未定义fd_mask”错误:

--with-cflags=-Dfd_mask=int

然后我收到以下错误:

错误:“struct passwd”没有名为“pw_gecos”的成员

Android的passwdstruct没有成员pw_gecos。如果不为源代码创建实际的补丁,就不可能纠正这个问题。补丁在这里

我现在遇到以下错误:

dns.c:在函数“dns_result_totext”中:
dns.c:56:7: 错误:'ERRSET_SUCCESS' 未声明(在此函数中首次使用)
dns.c:56:7:注意:每个未声明的标识符仅报告一次
  它出现在函数中
dns.c:58:7: 错误:'ERRSET_NOMEMORY' 未声明(在此函数中首次使用)
...

编辑:我对上面的补丁做了一些修改,消除了到目前为止的一些错误。我也添加了ldns。配置命令现在如下所示:

补丁 -p0 <openssh.patch;
自动配置;
./configure --prefix=/home/me/arm \
            --host=arm-linux-androideabi \
            --with-ldns=/home/me/arm \
            --with-ssl-dir=/home/me/arm \
            ac_cv_header_sys_un_h=是

...是新补丁。我现在得到的错误是:

loginrec.c:在函数“construct_utmp”中:
loginrec.c:665:17: 错误:'DEAD_PROCESS' 未声明(首次在此函数中使用)
loginrec.c:665:17:注意:每个未声明的标识符仅报告一次
  它出现的每个函数
loginrec.c:在顶层:
loginrec.c:727:45:警告:在参数列表中声明了“struct utmpx”
  [默认启用]