Цитата(gotty @ Sep 28 2010, 13:23)

Для корректного перехода в Main необходим текущий стек правильно настроить. Стартап помимо инициализации указателя на вершину стека инициализирует глобальные и статические переменные. Если вы пишете свой стартап - то должны реализовать необходимый минимум.
Ну, на страничке, ссылку на которую я кидал, написано так:
Сначала вызывается начальный код пользователя, который должен:
- инициализировать указатели стеков
- настроить MMU/MPU
- настроить кэш/включить TCM
После должна вызываться __main из стандартной библиотеки Си . __main выполняет следующие действия:
-копирует код (?)
-копирует/распаковывает RW-данные (поэтому нет ничего удивительного, что когда я вызывал сразу main не инициализировались глобальные переменные)
-обнуляет неинициализированные данные
Далее вызывается __rt_entry, которая
- инициализирует библиотечные функции
- вызывает __user_initial_stackheap()
- вызывает $Sub$main()
В основном коде функции __user_initial_stackheap() и $Sub$main() я не переопределял, значит будут вызваны библиотечные. Там же написано, что если используется scatter-файл для линкера, то линкер создаст __user_initial_stackheap(). Scatter-файл я не использую. Что происходит в этом случае?
После этого вызывается main().
Проблема в том, что библиотечный код изменяет указатель стека и прога рушится. Изменение SP происходит в функции sys_stackheap_outer.