`OpenOCD` - сервер отладки
```bash
$ 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`
```bash
$ 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` - включить отладку
Получить файл после препроцессора:
```bash
$ arm-none-eabi-gcc main.c delay.c -nostdlib -E > main.i
```
Получить объектный файл:
```bash
$ 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
```
Получить файл ассемблера:
```bash
$ 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-файла:
```bash
$ arm-none-eabi-readelf -h main.o
```
Получить объектный файл (остановиться перед компоновкой):
```bash
$ 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 объектного файла:
```bash
$ arm-none-eabi-objdump -h main.o
```
Секции
**.text** - код и константные значения
**.data** - инициализированные переменные
**.bss** - неинициализированные переменные
**.rodata** - данные только для чтения (пример const uint32_t delay_max = 0x0100)
**.comment** - информация о версии компилятора
**.ARM.attributes** - служебные сведения (не используются в конечной прошивке)
Посмотреть содержимое секции в объектном файле:
```bash
$ arm-none-eabi-objdump -s -j .text main.o
```
Вывести таблицу символов из объектного файла:
```bash
$ arm-none-eabi-objdump --syms main.o
```
Линкер
**Линкер** соединяет секции в нескольких объектных файлах и размещает их в памяти.