15

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

首先,我下载了 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
4

3 回答 3

42

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

安装 arm 交叉编译器 - (例如arm-linux-gcc 是什么以及如何在 ubuntu 中安装它

下载:

  • 兹库
  • OpenSSL
  • 开放SSH

构建 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”

于 2013-01-26T20:12:08.630 回答
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

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

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

一、编译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,它会尝试$ROOTFS/usr在 Mini6410 上运行时访问配置文件,而 Mini6410 并不存在。Makefile 中指定的安装路径是$INSTALL_PREFIX/$PREFIX,所以我们使用$ROOTFSfor $INSTALL_PREFIX

最后,编译 OpenSSH

  1. ./confgure --host=$HOST --prefix=/usr
  2. 删除变量STRIP_OPT并在 Makefilecheck-config中的规则。install
  3. make && make DESTDIR=$ROOTFS install
  4. 启动 Mini6410 并使用命令ssh-keygen生成主机密钥。

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

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

在最后一步,检查 Makefile 并找到 rule 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 ""
于 2014-01-12T07:56:35.517 回答
1

I do like this

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
于 2012-09-18T15:27:37.480 回答