Программирование ARM: решение проблем, FAQ arm-none-eabi-gcc: Exec format error Fri, April 19 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

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.
2. Is my Raspberry Pi running a 64 or 32 bits OS? site:raspberrytips.com.
3. Visual Studio Code на Raspberry Pi.

 

Добавить комментарий


Защитный код
Обновить

Top of Page