Подтвердить что ты не робот

Кросс-компиляция OpenSSH для ARM

Кто-нибудь знает, как я могу перекрестно скомпилировать OpenSSH для ARM? Это то, что я сделал:

Сначала я загрузил исходный код Zlib, распаковал его, построил и установил с помощью следующих команд:

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

   # make 

   # make install

Но затем, когда я пытаюсь скомпилировать OpenSSH для целевой платы ARM, она дает ошибку "zlib missing" во время процесса ./configure:

  # 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
4b9b3361

Ответ 1

Чтобы скомпилировать openSHH для ARM (в моем случае mini2440), я сделал следующее:

Установите кросс-компилятор - (например, что такое 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"

Ответ 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

Далее я определяю три переменные среды, HOST, ROOTFS и SYSROOT. HOST - arm-unknown-linux-gnueabi. ROOTFS - это корневая файловая система. SYSROOT - это каталог в качестве корневого каталога для заголовков и библиотек в toolchain.

Вы можете добавить CFLAGS и LD_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, которого не существует. Путь установки, указанный в Makefile, равен $INSTALL_PREFIX/$PREFIX, поэтому мы используем $ROOTFS для $INSTALL_PREFIX.

Наконец, скомпилируйте OpenSSH

  • ./confgure --host=$HOST --prefix=/usr
  • Удалите переменную STRIP_OPT и check-config в правиле install в Makefile.
  • make && make DESTDIR=$ROOTFS install
  • Загрузите свой Mini6410 и используйте команду ssh-keygen для генерации ключей хоста.

Причина использования /usr для --prefix такая же, как OpenSSL. Если вы укажете --prefix=$ROOTFS/usr, вы не сможете выполнить команду scp.

STRIP_OPT должны быть удалены, потому что невозможно использовать /usr/bin/install на x86-64 для разбиения бинарных файлов на 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 ""

Ответ 3

Мне нравится это

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

Ответ 4

Я пробую кросс-компиляцию для arm-poky-linux-gnueabi, но у меня ошибка в Zlib make.

...:~/zlib-1.2.11$ AR=$HOST-ar CC=$HOST-gcc RANLIB=$HOST-ranlib ./configure --prefix=$HOME/zlibARM 
Checking for shared library support... 
Building shared library libz.so.1.2.11 with arm-poky-linux-gnueabi-gcc. 
Checking for size_t... Yes. 
Checking for off64_t... Yes. 
Checking for fseeko... Yes. 
Checking for strerror... Yes. 
Checking for unistd.h... Yes. 
Checking for stdarg.h... Yes. 
Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf(). 
Checking for vsnprintf() in stdio.h... Yes. 
Checking for return value of vsnprintf()... Yes. 
Checking for attribute(visibility) support... Yes.

...:~/zlib-1.2.11$ make
arm-poky-linux-gnueabi-gcc -O3 -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -I. -c -o example.o test/example.c
make: execvp: arm-poky-linux-gnueabi-gcc : Trop de niveaux de liens symboliques
Makefile:147: recipe for target 'example.o' failed
make: *** [example.o] Error 127

Вы можете мне помочь?