为 ARM 交叉编译 OpenSSH

Posted

技术标签:

【中文标题】为 ARM 交叉编译 OpenSSH【英文标题】:Cross Compile OpenSSH for ARM 【发布时间】:2012-08-04 05:29:55 【问题描述】:

有人知道我如何交叉编译 OpenSSH for ARM 吗? 这就是我所做的:

首先我下载了​​ Zlib 源代码,解压,构建并使用以下命令行安装它:

   # ./configure --prefix=/usr/local/cross/arm

   # make 

   # make install

但是当我尝试为 ARM 目标板编译 OpenSSH 时,它在./configure 过程中给出了错误“zlib missing”:

  # sudo LDFLAGS=-L/usr/local/cross/arm/lib CC=arm-none-linux-gnueabi-gcc PATH=$PATH:/home/arishop/arm-tool-chain/arm-fsl-linux-gnueabi/bin/ ./configure --host=arm-linux --with-zlib=/usr/local/cross/arm/ --prefix=/usr/local/cross/arm/openssh

【问题讨论】:

我想你也想交叉编译zlib 【参考方案1】:

为了交叉编译用于 ARM 的 openSHH(在我的例子中是 mini2440),我做了以下操作:

安装 arm 交叉编译器 - (例如what is arm-linux-gcc and how to install this in ubuntu)

下载:

Zlib OpenSSL OpenSSH

构建 Zlib:

cd zlib-1.2.7
CC=arm-linux-gnueabi-gcc
./configure --prefix=$HOME/zlibArm
make 
make install

构建 OpenSSL:

export cross=arm-linux-gnueabi-
cd openssl-1.0.1c
./Configure dist --prefix=$HOME/opensslArm
make CC="$crossgcc" AR="$crossar r" RANLIB="$crossranlib"
make install

构建 OpenSSH:

./configure --host=arm-linux --with-libs --with-zlib=$HOME/zlibArm --with-ssl-dir=$HOME/opensslArm --disable-etc-default-login CC=gcc-arm-linux-gnueabi-gcc AR=gcc-arm-linux-gnueabi-ar
make

更多信息请访问http://code.google.com/p/openssh4mini2440/wiki/HowTo,下载源代码并阅读“build.sh”

【讨论】:

+1 出色的说明,工作起来就像一个魅力。 (我的目标是arm-linux-androideabi,但过程几乎相同。) 我的 Ubuntu 系统上的 OpenSSL 构建失败,必须将一行更改为 export cross=arm-linux-gnueabi-(删除“gcc-”前缀) 使用 openssh 5.3p1,我必须包含 ranlib ./configure --host=arm-davinc-linux-gnueabi --with-libs --with-zlib=/opt/linux-2-6-31-xtools/x-tools/arm-davinci-linux-gnueabi/ --with-ssl-dir=/opt/linux-2-6-31-xtools/x-tools/arm-davinci-linux-gnueabi/ --disable-etc-default-login CC=arm-davinci-linux-gnueabi-gcc AR=arm-davinc-linux-gnueabi-ar RANLIB=arm-davinc-linux-gnueabi-ranlib zlib 的第一个 make 甚至没有使用 ARM 编译器。这是故意的吗?如果我尝试使用 ARM 编译器制作 zlib,则会因 crc32 无法正常工作而失败。 在构建zlib之前我必须export TARGETMACH=arm-linux-gnueabi; export BUILDMACH=i686-pc-linux-gnu; export CROSS=arm-linux-gnueabi; export CC=$CROSS-gcc; export LD=$CROSS-ld; export AS=$CROSS-as;,后来我为openssh交叉编译修改了以下CC=arm-linux-gnueabi-gcc AR=arm-linux-gnueabi-ar【参考方案2】:

使用的板子是Mini6410。 OpenSSH 的要求包括 zlib 和 OpenSSL。我准备好了

zlib 1.2.8 OpenSSL 1.0.1e OpenSSH 6.4p1

我的工具链是由 crosstool-NG 1.15.2 构建的。下面的工具链配置是从 arm-unknown-linux-gnueabi 修改而来的。

Arch:         armv6
CPU:          arm1176jzf-s
FPU:          vfp
Linux kernel: 2.6.38.8
binutils:     2.19.1a
gcc:          4.6.3
glibc:        2.11
gmp:          4.3.2
mpfr:         3.0.1
ppl:          0.11.2
cloog:        0.15.11
mpc:          0.9

接下来我定义了三个环境变量HOSTROOTFSSYSROOTHOST 是 arm-unknown-linux-gnueabi。 ROOTFS 显然是根文件系统。 SYSROOT 是工具链中头文件和库的根目录。

您可以添加 CFLAGSLD_LIBRARY_PATH 指向您的根文件系统,以便交叉编译器可以找到您已安装的内容。但是,我不喜欢设置这些变量。另一种方法是在SYSROOTROOTFS 中安装这些库。

首先,编译zlib

AR=$HOST-ar CC=$HOST-gcc RANLIB=$HOST-ranlib ./configure --prefix=$ROOTFS/usr
make
make install

二、编译OpenSSL

./Configure linux-armv4 shared zlib-dynamic --prefix=/usr
make CC=$HOST-gcc AR="$HOST-ar r" RANLIB=$HOST-ranlib
make CC=$HOST-gcc AR="$HOST-ar r" RANLIB=$HOST-ranlib INSTALL_PREFIX=$ROOTFS install

请注意,--prefix 设置为 /usr,而不是 $ROOTFS/usr。原因是如果你将--prefix设置为$ROOTFS/usr,它会尝试在Mini6410上运行时访问$ROOTFS/usr中的配置文件,而这并不存在。 Makefile中指定的安装路径是$INSTALL_PREFIX/$PREFIX,所以我们用$ROOTFS代替$INSTALL_PREFIX

最后,编译 OpenSSH

    ./confgure --host=$HOST --prefix=/usr 在 Makefile 的规则 install 中删除变量 STRIP_OPTcheck-configmake && make DESTDIR=$ROOTFS install 启动您的 Mini6410 并使用命令ssh-keygen 生成主机密钥。

/usr 用于--prefix 的原因与 OpenSSL 相同。如果指定--prefix=$ROOTFS/usr,将无法执行命令scp

STRIP_OPT 必须被删除,因为不可能在 x86-64 上使用 /usr/bin/install 来剥离 ARM 上的二进制文件。规则check-config 将在主机上运行生成的sshd,所以我们必须避免这种情况。

在最后一步,检查 Makefile 并找到规则host-key。下一行是@if [ -z "$(DESTDIR)" ] ; then,这意味着如果$(DESTDIR) 的长度不为零,它什么也不做。因此,我们必须在 Mini6410 上手动生成这些密钥:

ssh-keygen -t rsa1 -f /usr/etc/ssh_host_key -N ""
ssh-keygen -t dsa -f /usr/etc/ssh_host_dsa_key -N ""
ssh-keygen -t rsa -f /usr/etc/ssh_host_rsa_key -N ""
ssh-keygen -t ecdsa -f /usr/etc/ssh_host_ecdsa_key -N ""

【讨论】:

小插件,使用选项配置openSSL时添加zlib位置:--with-zlib-include=$ROOTFS/usr/include --with-zlib-lib=$ROOTFS/usr/lib 这对我帮助很大。关于删除STRIP_OPTcheck-config 的部分可能会更清楚。我还需要将--with-zlib=$ROOTFS/usr 添加到 OpenSSH 的配置中。【参考方案3】:

我喜欢这个

CC=arm-none-linux-gnueabi-gcc RANLIB=arm-none-linux-gnueabi-ranlib ./配置 linux-armv4 --prefix=$OPENSSLARM --openssldir=$OPENSSLARM 使 CC=arm-none-linux-gnueabi-gcc AR="arm-none-linux-gnueabi-ar r" RANLIB="arm-none-linux-gnueabi-ranlib" 进行安装

【讨论】:

以上是关于为 ARM 交叉编译 OpenSSH的主要内容,如果未能解决你的问题,请参考以下文章

arm交叉编译工具链下载

为 arm 交叉编译 iptables 的问题

为 ARM 交叉编译时共享对象导入错误

使用 Autoconf 为 ARM 进行交叉编译

arm-linux交叉编译器的路径设置问题,怎么办????

为 ARM 交叉编译 ActiveMQ