Цитата(Сергей Борщ @ Dec 8 2015, 16:56)

1) Библиотечные функции. Если компилятор их решил использовать, то у загрузчика они должны быть свои. А это может быть что угодно - арифметика, ветвление по таблице, пролог/эпилог функций и т.д.
Простенький бут обходится без библиотечных функций.
Цитата(Сергей Борщ @ Dec 8 2015, 16:56)

2) Неловкое движение может сделать вашу программу несовместимой с загрузчиками старых версий в предыдущих версиях уже проданного железа. При этом она будет дружить с последней версией загрузчика, вместе с которой собирается
У меня обычно вызов только одной функции из основной программы, она размещается в отдельной секции, и никаких проблем с совместимостью.
Цитата(Сергей Борщ @ Dec 8 2015, 16:56)

3) потом их все равно надо разделить, чтобы послать пользователям только приложение.
Ну а это то вообще элементарно, основная программа в секциях isr_vector, text и data
arm-none-eabi-objcopy -O binary -j .isr_vector -j .text -j .data
В результате бут по CSD звонку обновляет программу.
Цитата(Непомнящий Евгений @ Dec 8 2015, 17:31)

Я ж писал выше - KEEP(*(xxx)), где xxx - имя секции с этой функцией. Его можно посмотреть в map-файле
но опять же, если загрузчик тривиальный, сделайте заглушку
Да пробовал я KEEP, выкидывает

.