为ARM交叉编译OpenSSH

17

有人知道如何为ARM交叉编译OpenSSH吗?以下是我的操作:

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

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

   # make 

   # make install

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

  # 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。 - rogerdpack
3个回答

44

为了交叉编译适用于ARM(在我的情况下是mini2440)的OpenSSH,我按照以下步骤进行:

安装ARM交叉编译器 - (例如:什么是arm-linux-gcc以及如何在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="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
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
+1 优秀的指导,操作起来非常顺利。(我原本是针对arm-linux-androideabi进行操作,但整个过程几乎完全相同。) - Nathan Osman
4
在我的Ubuntu系统上,OpenSSL构建失败了,我不得不更改一行代码为export cross=arm-linux-gnueabi-(去掉“gcc-”前缀)。 - Robert
使用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 - Kevin
对于OpenSSL的构建,可以在Configure调用之前执行export CROSS_COMPILE=arm-linux-gnueabi-,或者等效地使用--cross_compile_prefix=arm-linux-gnueabi-选项。这样可以将配置和构建步骤绑定在一起,避免显式配置CC和其他变量。 - alkalinity
1
在构建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 - enthusiasticgeek
显示剩余5条评论

11

所使用的开发板为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

下面我定义了三个环境变量:HOSTROOTFSSYSROOT。其中,HOST为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

  1. ./configure --host=$HOST --prefix=/usr
  2. 在Makefile的规则install中删除变量STRIP_OPTcheck-config
  3. make && make DESTDIR=$ROOTFS install
  4. 启动您的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 ""

1
在使用选项 --with-zlib-include=$ROOTFS/usr/include --with-zlib-lib=$ROOTFS/usr/lib 配置 openSSL 时,需要添加 zlib 的位置。 - Bechir
这对我帮助很大。关于删除 STRIP_OPTcheck-config 的部分可能需要更清晰明了一些。此外,我需要在 OpenSSH 的配置中添加 --with-zlib=$ROOTFS/usr - Dominik

1

我喜欢这样做

CC=arm-none-linux-gnueabi-gcc RANLIB=arm-none-linux-gnueabi-ranlib ./Configure linux-armv4 --prefix=$OPENSSLARM --openssldir=$OPENSSLARM
make CC=arm-none-linux-gnueabi-gcc AR="arm-none-linux-gnueabi-ar r" RANLIB="arm-none-linux-gnueabi-ranlib"
make install

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接