build.md 5.2 KB

OpenOCD - сервер отладки

$ sudo wget -qO /etc/apt/trusted.gpg.d/kitware-key.asc https://apt.kitware.com/keys/kitware-archive-latest.asc

$ echo "deb https://apt.kitware.com/ubuntu/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/kitware.list

$ sudo add-apt-repository -y ppa:git-core/ppasudo apt update

$ sudo apt upgradesudo apt install -y build-essential make libtool pkg-config cmake curl automake autoconf gcc git texinfo python3-dev libpython3-dev liblzma5 libncurses5 libncurses5-dev libusb-1.0-0-dev libgtk-3-dev libstlink-dev libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev xz-utils tk-dev

GCC
-nostdlib - не использовать стандартные библиотеки, взять заглушки. Библиотеки GNU ARM используют newlib для обеспечения стандартной реализации библиотек C. Конкретнее newlib-namo

$ arm-none-eabi-gcc main.c delay.c -o main.elf -nostdlib

mcpu=cortex-m0 или march= - архитектура -mthumb - набор команд -mfloat-abi=soft - если нет модуля fpu -std=gnu11 - стандарт GNU --specs=nano.specs - для использования библиотеки newlib-nano --specs=nosys.specs - для использования библиотеки nosys -Wall - включить все warnings -g - включить отладку

Получить файл после препроцессора:

$ arm-none-eabi-gcc main.c delay.c -nostdlib -E > main.i

Получить объектный файл:

$ arm-none-eabi-gcc main.i -o main.o -nostdlib -fpreprocessed-mcpu=cortex-m0 -mthumb -mfloat-abi=soft -std=gnu11 -Wall --specs=nano.specs --specs=nosys.specs -g 

Получить файл ассемблера:

$ arm-none-eabi-gcc -s main.c -o main.s -S -nostdlib -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -std=gnu11 -Wall --specs=nano.specs --specs=nosys.specs

Вывести заголовок elf-файла:

$ arm-none-eabi-readelf -h main.o 

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

$ arm-none-eabi-gcc -c main.c -o main.o -nostdlib -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -std=gnu11 -Wall --specs=nano.specs --specs=nosys.specs

$ arm-none-eabi-gcc -c delay.c -o delay.o -nostdlib -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -std=gnu11 -Wall --specs=nano.specs --specs=nosys.specs

Вывести dump объектного файла:

$ arm-none-eabi-objdump -h main.o

Секции
.text - код и константные значения .data - инициализированные переменные .bss - неинициализированные переменные .rodata - данные только для чтения (пример const uint32_t delay_max = 0x0100) .comment - информация о версии компилятора .ARM.attributes - служебные сведения (не используются в конечной прошивке)

Посмотреть содержимое секции в объектном файле:

$ arm-none-eabi-objdump -s -j .text main.o

Вывести таблицу символов из объектного файла:

$ arm-none-eabi-objdump --syms main.o

Линкер
Линкер соединяет секции в нескольких объектных файлах и размещает их в памяти.

Секции в файле линкера:

  • ENTRY - сообщает точку входа и указывает первую инструкцию
  • MEMORY - участи памяти целевой системы
  • SECTIONS - раскладка содержания секций объектных файлов в памяти

Секции из объектных файлов:

  • Секция .isr_vector — это служебная секция, которая не создается по умолчанию и ее необходимо создать вручную. По сути, в ней указывается вектор обработчика прерываний ISR, который должен находиться по адресу 0x0000 0000;
  • Секция .text — это исполняемый код, находящийся во Flash;
  • Секция .data — это переменные, размещенные в SRAM;
  • Секция .rodata — это константы, размещенные в Flash;
  • Секция .bss — это объявленные, но не инициализированные переменные, то есть с нулевым значением при старте, которые будут размещены в SRAM.

Служебные символы:

  • _etext — конец секции .text
  • _sdata — старт секции .data
  • _edata — конец секции .data;
  • _sbss — старт секции .bss;
  • _ebss — конец секции .bss.