Кросс-компиляция с помощью Linaro 7.1.1 arm-linux-gnueabihf
Как правильно загрузить набор инструментов linaro и настроить его так, чтобы я мог использовать его с Makefile ядра? Когда я тестирую свою версию на arm-linux-gnueabihf-gcc --version
функция работает, но при компиляции собственного ядра происходит сбой.
контекст
Я работаю над компиляцией собственного ядра Linux для доски Beaglebone Black. Руководство по сборке собственного ядра приведено здесь.
Следуя инструкциям руководства, мне нужно использовать arm-linux-gnueabihf-gcc
для кросс-компиляции ядра для оборудования Beaglebone. Поэтому я установил набор инструментов Линаро с их сайта. Я просто скачал его, а затем распаковал в /opt/
папка.
$ cd /opt/
$ sudo mv gcc-linaro-7.1.1-2017.08-x86_64_arm-linux-gnueabi.tar.xz/ gcc-arm-linux
$ export PATH=$PATH:/opt/gcc-arm-linux/bin
Я проверяю и проверяю, что все работает при установке.
$ arm-linux-gnueabihf-gcc --version
И мой вывод выглядит следующим образом:
Как только я закончу с этим, я собираю ядро, используя стандартный Makefile.
$ cd ~/linux
$ sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bb.org_defconfig
$ sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage dtbs LOADADDR=0x80008000 -j4
На этом этапе я сталкиваюсь с ошибками в команде, чтобы фактически скомпилировать ядро.
Makefile:686: Cannot use CONFIG_CC_STACKPROTECTOR_STRONG: -fstack-protector-strong not supported by compiler
make: arm-linux-gnueabihf-gcc: Command not found
CHK include/config/kernel.release
CHK include/generated/uapi/linux/version.h
CC scripts/mod/empty.o
/bin/sh: 1: arm-linux-gnueabihf-gcc: not found
scripts/Makefile.build:258: recipe for target 'scripts/mod/empty.o' failed
make[2]: *** [scripts/mod/empty.o] Error 127
scripts/Makefile.build:403: recipe for target 'scripts/mod' failed
make[1]: *** [scripts/mod] Error 2
make[1]: *** Waiting for unfinished jobs....
Makefile:556: recipe for target 'scripts' failed
make: *** [scripts] Error 2
make: *** Waiting for unfinished jobs....
Что наиболее запутанно, так это то, что ошибки указывают на то, что arm-linux-gnueabihf-gcc: not found
Однако я могу запустить команду arm-linux-gnueabihf-gcc --version
в той же папке, и он будет работать правильно.
Решением этой проблемы может быть просто установить его с помощью apt:
sudo apt-get install gcc-arm*
Что предлагается в этом ответе, но это не решает мою путаницу.
Почему я могу проверить свою версию на arm-linux-gnueabihf-gcc
функция, но она не выполняется в Makefile должным образом? Как правильно загрузить набор инструментов linaro и настроить его так, чтобы я мог использовать его с Makefile ядра?
1 ответ
Не уверен, что это та же проблема, что и у меня, но я наткнулся на этот пост, когда искал ответ на свой вопрос.
Я столкнулся с подобной проблемой при использовании старого кросс-компилятора linux-arm из контейнера докера. Проблема заключалась в том, что двоичный двоичный код gcc был 32-разрядным, а контейнер, выполняющий make, был 64-разрядным. Скрипт make сообщал, что "arm-linux/gcc not found"
Вы можете проверить, является ли он 32-битным, выполнив
file absolute-path-to-gcc
например
root@b61b0b938b8a:~# file /usr/local/arm-linux/bin/gcc
/usr/local/arm-linux/bin/gcc: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, stripped
Чтобы это исправить я должен был добавить i386
в док-контейнер, как в этом вопросе
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386