`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
```
<h6>GCC</h6>
`-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
```
<h6>Секции</h6>
**.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
```
<h6>Линкер</h6>
**Линкер** соединяет секции в нескольких объектных файлах и размещает их в памяти.

**Секции в файле линкера:**
- 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.