Ну вот у меня в стартапе, например, вот так происходит
инициализация переменных перед вызовом main(): extern char __etext[], __data_start__[], __data_len[];
memcpy(__data_start__, __etext, (int)__data_len);
То есть адрес края прошивки вычислить легко: __etext + (int)__data_len. Ну оттуда и плясать дальше.