Кросс-компиляция 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
Ответы
Ответ 1
Чтобы скомпилировать openSHH для ARM (в моем случае mini2440), я сделал следующее:
Установите кросс-компилятор -
(например, что такое arm-linux-gcc и как установить это в ubuntu)
Скачать:
Сборка 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
Вы можете мне помочь?