arm-none-eabi-gcc: Exec format error |
![]() |
Добавил(а) microsin |
После загрузки репозитория OpenBK7231N [1] и попытки его компиляции на Paspberry Pi 4 B столкнулся с ошибкой запуска компилятора arm-none-eabi-gcc: ..
/bin/sh: 1: toolchain/gcc-arm-none-eabi-4_9-2015q1/bin/arm-none-eabi-gcc: Exec format error
make[1]: *** [application.mk:1074: beken378/app/app_bk.o] Error 2
..
Причина проблемы в том, что тулчейн ARM в репозитории [1] не подходит для текущей версии операционной системы. Необходимо установить тулчейн ARM соответствующей разрядности (32 или 64 бита), и исправить скрипты, чтобы запускался компилятор нужной версии. Процесс по шагам: 1. Как узнать имя пакета для установки: $ apt list | grep arm-none
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
binutils-arm-none-eabi/oldstable 2.31.1-11+rpi1+11 armhf
gcc-arm-none-eabi-source/oldstable 15:7-2018-q2-6 all
gcc-arm-none-eabi/oldstable 15:7-2018-q2-6 armhf
libnewlib-arm-none-eabi/oldstable 3.1.0.20181231-1 all
libnewlib-nano-arm-none-eabi/oldstable 2.11.2-1 all
libstdc++-arm-none-eabi-newlib/oldstable 15:7-2018-q2-5+12 all
Очевидно, что пакет называется gcc-arm-none-eabi. 2. Установка компилятора: $ sudo apt install gcc-arm-none-eabi
3. Проверка установки: $ arm-none-eabi-gcc --version
Если эта команда завершилась без ошибок, то все в порядке. Осталось поправить скрипт компиляции. 4. С помощью команды grep можно узнать, какие скрипты надо исправить, чтобы запускался наш только что установленный компилятор. Вероятно надо искать строку gcc-arm-none-eabi-4_9-2015q1, исключая каталог .git: $ grep -r --exclude-dir=.git "gcc-arm-none-eabi-4_9-2015q1" .
./platforms/bk7231n/toolchain/build_path:export TUYA_SDK_TOOLCHAIN_ZIP=gcc-arm-none-eabi-4_9-2015q1.tar
./platforms/bk7231n/toolchain/build_path:export TUYA_SDK_BUILD_PATH=gcc-arm-none-eabi-4_9-2015q1/bin/arm-none-eabi-
Binary file ./platforms/bk7231n/bk7231n_os/beken378/lib/libble.a matches
Binary file ./platforms/bk7231n/bk7231n_os/beken378/lib/librwnx.a matches
./platforms/bk7231n/bk7231n_os/application.mk:# Initialize tool chain /usr/bin/gcc-arm-none-eabi-4_9-2015q1/bin
./platforms/bk7231n/bk7231n_os/application.mk:ARM_GCC_TOOLCHAIN = $(TOOLCHAIN_DIR)/gcc-arm-none-eabi-4_9-2015q1/bin
Вероятно, надо исправить переменную CROSS_COMPILE в файле application.mk: # CROSS_COMPILE = $(ARM_GCC_TOOLCHAIN)/arm-none-eabi-
CROSS_COMPILE = arm-none-eabi-
После этого утилиты будут запускаться нормально. В процессе компиляции скрипт application.mk выводит множество ошибок, что замедляет процесс компиляции: ..
find: ‘apps/OpenBK7231N_App/include’: No such file or directory
..
find: ‘apps/OpenBK7231N_App/src’: No such file or directory
..
Причина этой проблемы в том, что в папке apps/OpenBK7231N_App отсутствуют подкаталоги include и src, где могут находиться файлы исходного кода пользователя. Исправить можно двумя способами: 1. Создать в папке OpenBK7231N_App подкаталоги include и src. 2. Исправить в скрипте application.mk переменные TY_SRC_DIRS и TY_INC_DIRS (надо закомментировать строчки, которые добавляют к этим переменным каталоги src и include соответственно). # TY_SRC_DIRS += $(shell find $(TOP_DIR)/apps/$(APP_BIN_NAME)/src -type d)
TY_SRC_DIRS += $(shell find tuya_os_adapter/src -type d)
TY_INC_DIRS += $(shell find $(TOP_DIR)/sdk/include -type d)
TY_INC_DIRS += $(shell find tuya_os_adapter/include -type d)
# TY_INC_DIRS += $(shell find $(TOP_DIR)/apps/$(APP_BIN_NAME)/include -type d)
В процессе компиляции утилиты не могут записать некоторые файлы, если они существуют, и нет текущих прав на запись, или нет прав на запись с определенную папку. В моем случае это был файл tuya.map в каталоге platforms\bk7231n\bk7231n_os\, и каталог apps\OpenBK7231N_App\output\1.0.0\. Проблема решается либо запуском скрипта с правами root (через sudo), либо назначением прав на запись для обычных пользователей (write by others). Проблема решается правкой файла platforms\bk7231n\bk7231n_os\beken378\app\app_bk.c, в него надо добавить заглушку для функции CFG_GetDeviceName: const char *CFG_GetDeviceName() { return "SomeName"; } [Ссылки] 1. SDK used to build Tasmota replacement for BK7231N platform site:github.com. |