Да, касательно указания компилятору, где какая область памяти находится. Пока накопал следующую инфу: объектный файл разбит на несколько секций:
- секция .text -- это непосредственно машинный код
- секция .data -- это данные программы (как я понял, это что-то вроде progmem, но могу ошибаться, надо еще изучать тему)
- секция .bss -- это и есть наша "куча", область для статических переменных
- секция .stack -- это область стека
Изначально этим секциям присвоены какие-то неочевидные адреса. (например, для .text начальный адрес -- 0x8000032C). Слева на этом дампе можно видеть адреса. Если преобразовывать -o в -hex, то там те же адреса программ остаются
Когда мы преобразуем .o файл в гексовый с помощью objcopy, можно изменить дефолтные адреса секций ключом --change-section-address.
- с .text все понятно -- в конечном гексовом файле видно, как изменяются адреса кода
- с .bss в теории понятно -- устанавливаем адрес начала "кучи"
- co .stack в теории тоже понятно
- а вот что касается .data, мне пока не очень понятно, какой адрес ему выдавать, .data должно быть в той же области памяти, что и .text
Короче надо копать дальше
А лучше, найти какую-то книгу, в которой это все было бы расписано подробно