Компиляция Crypto++ для armhf для кросс-компиляции

Я хочу кросс-компилировать библиотеку crypto++ для развертывания на beaglebone под управлением Debian. На моем хост-компьютере установлена ​​Ubuntu 14.04 LTS в 64-битной конфигурации.

Я сталкиваюсь со следующей проблемой, когда вызываю команду make из eclipse

arm-linux-gnueabihf-g++-4.8 -L/usr/include/cryptopp -o "GCMwithAES"  ./main.o   -lcryptopp
/usr/lib/../lib/libcryptopp.so: file not recognized: File format not recognized

Я предполагаю, что поскольку компилятор настроен для armhf, он не может распознать библиотеку, скомпилированную для amd64.

Я успешно перекрестно скомпилировал и запустил стандартные (т.е. без внешних библиотек) программы с моего хост-компьютера на целевое устройство.

Решения, которые я пробовал

  • Использованы пакеты libcrypto++ с архитектурой, указанной как armhf, как это сделано в multiarch. Библиотеки armhf устанавливаются (согласно apt), но я не могу включить и связать с ними свой код.
  • Попробуйте вручную скомпилировать библиотеку в соответствии с инструкциями, приведенными в этой вики. Однако я всегда сталкиваюсь с ошибками всякий раз, когда пытаюсь скомпилировать библиотеку.

Как мне установить библиотеки libcryptopp для архитектуры armhf на мой компьютер с архитектурой x64, чтобы я мог выполнять кросс-компиляцию? или есть другой способ решить эту проблему.

Изменить

Как было предложено в ответе ниже, я опробовал предложенный метод. Я немного модифицировал скрипт setenv-embed.sh, так как у меня был gcc-4.8 вместо gcc-4.7. Результаты работы скрипта

CPP: /usr/bin/arm-linux-gnueabihf-cpp 
CXX: /usr/bin/arm-linux-gnueabihf-g++
AR: /usr/bin/arm-linux-gnueabihf-ar
LD: /usr/bin/arm-linux-gnueabihf-ld
RANLIB: /usr/bin/arm-linux-gnueabihf-gcc-ranlib-4.8

ARM_EMBEDDED_TOOLCHAIN: /usr/bin
ARM_EMBEDDED_CXX_HEADERS: /usr/arm-linux-gnueabihf/include/c++/4.8.2
ARM_EMBEDDED_FLAGS: -march=armv7-a mfloat-abi=hard -mfpu=neon -I/usr/arm-linux-gnueabihf/include/c++/4.8.2 -I/usr/arm-linux-gnueabihf/include/c++/4.8.2/arm-linux-gnueabihf 
ARM_EMBEDDED_SYSROOT: /usr/arm-linux-gnueabihf

Я собираю библиотеку с помощью команды make и сталкиваюсь со следующей ошибкой.

/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/bin/‌​ld: cannot find /usr/arm-linux-gnueabihf/lib/libc.so.6 inside /usr/arm-linux-gnueabihf
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/bin/‌​ld: cannot find /usr/arm-linux-gnueabihf/lib/libc_nonshared.a inside /usr/arm-linux-gnueabihf        
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/bin/‌​ld: cannot find /usr/arm-linux-gnueabihf/lib/ld-linux-armhf.so.3 inside /usr/arm-linux-gnueabihf

Но когда я открываю местоположение /usr/arm-linux-gnueabihf/lib, я могу найти все три файла ошибок, упомянутые выше, то есть libc.so.6, libc_nonshared.a и ld-linux-armhf.so.3.

Согласно предложениям @jww, я переношу это на новый вопрос, так как у меня проблемы со связью. Мои результаты здесь оставлены для полноты.


person user3079474    schedule 27.07.2015    source источник
comment
По вашему предложению задам еще один вопрос.   -  person user3079474    schedule 29.07.2015
comment
Новый вопрос: stackoverflow.com/ вопросы/31698241/   -  person user3079474    schedule 29.07.2015
comment
Где вы взяли набор инструментов? Это Убунту? Терри Го и ARM? Или чужой?   -  person jww    schedule 02.08.2015
comment
я установил набор инструментов, используя apt-get install arm-linux-gnueabihf-gcc arm-linux-gnueabihf-g++   -  person user3079474    schedule 03.08.2015
comment
Недавно мы добавили сообщение, которое направляет вас к следующему шагу после запуска setenv-*.sh. Я пинаю себя под зад, потому что давно должен был понять, что это необходимо.   -  person jww    schedule 14.06.2016


Ответы (2)


Как мне установить библиотеки libcryptopp для архитектуры armhf на мой компьютер с архитектурой x64, чтобы я мог выполнять кросс-компиляцию? или есть другой способ решить эту проблему.

Ознакомьтесь с ARM Embedded (командная строка) на вики Crypto++.

Примечание: эта вики-страница немного устарела. Теперь вы можете использовать GNUmakefile-cross. Я не обновил страницу, чтобы отразить последние изменения, такие как GNUmakefile-cross.

GNUmakefile-cross – специально созданный для кросс-компиляции на Android, iOS, Windows Phone, ARM Embedded и «голое железо» (сомневаюсь, что кто-то будет делать это позже, но я протестировал его как платформу). Вам все равно нужно будет запустить скрипт setenv-embedded.sh.

Чтобы получить последние исходники с GitHub:

git clone https://github.com/weidai11/cryptopp.git cryptopp-armhf

Исходники GitHub на данный момент достаточно активны. Мы готовимся к выпуску Crypto++ 5.6.3. 5.6.3 будет включать GNUmakefile-cross.


Полные инструкции будут выглядеть примерно так (при условии, что у вас установлены инструменты):

git clone https://github.com/weidai11/cryptopp.git cryptopp-armhf
cd cryptopp-armhf

# Note the leading dot!!!
. ./setenv-embedded.sh
# The command above must execute successfully
# It cannot display a message like "**CXX is not valid**"

# Build it
make -f GNUmakefile-cross static dynamic cryptest.exe

# Check it
$ find . -name cryptest.exe
./cryptest.exe
$ /usr/bin/arm-linux-gnueabi-readelf -h ./cryptest.exe | grep -i 'class\|machine' 
  Class:                             ELF32
  Machine: 

Поскольку исходные коды GitHub в настоящее время довольно активны, я уже добавил все остальные файлы из Crypto++-Mobile.zip и Setenv-embedded.sh.zip в официальные исходники Crypto++. Вам нужно только получить setenv-embedded.sh из Setenv-embedded.sh.zip.

person jww    schedule 27.07.2015
comment
пришлось запускать команду как root git clone https://github.com/weidai11/cryptopp.git cryptopp-armhf - person user3079474; 29.07.2015
comment
приходилось запускать команду от имени пользователя root... - это странно. Обычно это пользовательская команда. - person jww; 29.07.2015

В дополнение к ответу jww я хотел бы добавить некоторые дополнительные примечания. (Эти примечания относятся к версии 5.6.3, выпущенной 20 ноября 2015 г.)

Возможно, потребуется отредактировать файл config.h, чтобы изменить некоторые параметры. См. Config.h на вики Crypto++. Особенно:

  • CRYPTOPP_NO_UNALIGNED_DATA_ACCESS, возможно, потребуется определить, чтобы код правильно работал в системах, которые не могут выполнять чтение/запись невыровненных данных (например, ARM).
  • Возможно, потребуется определить CRYPTOPP_INIT_PRIORITY и CRYPTOPP_USER_PRIORITY. Дополнительные сведения см. в разделе Fiasco статического порядка инициализации — Crypto++ Wiki.
  • CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY_562 может потребоваться определить или не определить, в зависимости от того, использует ли проект, использующий его, более старые функции API или нет.

После сборки библиотеки очень важно запустить тестовую программу cryptest.exe v на целевой системе, чтобы проверить, подходит ли библиотека для этой системы. Например, сделав это, я обнаружил, что библиотека не работает должным образом на BeagleBone Black на базе ARM, если я не определяю CRYPTOPP_NO_UNALIGNED_DATA_ACCESS в config.h (она зависает на неопределенный срок на этапе тестирования Testing MessageDigest algorithm SHA-384.).

person Craig McQueen    schedule 08.04.2016
comment
Хорошие моменты, Крейг. CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY_562 исчезнет, ​​как только мы выпустим Crypto++ 5.7. Мы отслеживаем его по проблеме 70: удалить MAINTAIN_BACKWARDS_COMPATIBILITY_562. Нам нужно было оставить его на месте, чтобы сохранить совместимость с ABI. - person jww; 08.04.2016
comment
Я обнаружил, что библиотека не работает должным образом на BeagleBone Black на базе ARM... — вот отчеты об ошибках по этой проблеме: Проблема 45: Попытка поддержать GCC -fdevirtualize и Проблема 47: зависание SHA с оборудованием Debian Sid, GCC 5.2 и Core2 Duo. Выпуск 47 был снят с выпуском 45. - person jww; 08.04.2016