Цитата(Dopler @ Feb 18 2010, 10:40)

"GNU Compiler Collection Internals" для меня пока сложен, я почти не понимаю, о чем речь.
Он вам пока не нужен. Пока вы не захотите что-то подправить в самом компиляторе или портировать его для нового процессора.
Цитата(Dopler @ Feb 18 2010, 10:40)

1. Как устроена C программа, т.е. какие минимальные действия нужно выполнить для инициализации окружения: инициализировать стек и кучу, обнулить глобальные переменные, что еще?
Скопировать начальные значения в инициализированные глобальные и статические переменные, вызвать конструкторы(для С++), вызвать собственно main(). После возврата из main() вызвать деструкторы(для С++), закрыть файлы(если они есть), освободить память кучи, отдать управление операционной системе(если она есть) или бесконечный цикл. Все это называется C-startup код. Не знаю, как для AVR32, для AVR он уже есть готовый библиотечный, для ARM без ОС он подключается к проекту отдельным ассемблерным файлом. Обычно носит название crt???.S или gcrt???.S
Цитата(Dopler @ Feb 18 2010, 10:40)

2. Если создать примитивный проект с пустой функцией main, то gcc подключает стандартный стартап, в итоге в выходном .elf файле появляется ряд секций.
Не понятно, какие из этих секций порождает компилятор, а какие описаны в стартовом коде. И вообще где почитать, какие секции для работы C программы обязательны (как они называются, что в них размещается).
О! Значит библиотечный стартап есть и до возникновения острой необходимости можете о нем не думать. Можете смело рассчитывать, что на момент запуска main() все проинициализировано в соответствии со стандартом. Основных секций три: .text = это программный код, .bss - неинициализированные явно глобальные и статические переменые (те, которые обнуляются) и в последних версиях gcc сюда попадают явно проинициализированные нулем переменные. .data - это проинициализированные глобальные и статические переменные. В секции .rodata хранятся константы. .debug_*, .stabs.* - отладочная информация. Вроде ничего важного не забыл. Возможны еще какие-то секции специфичные для конкретной архитектуры.
Цитата(Dopler @ Feb 18 2010, 10:40)

В документации на GCC (gccint.pdf) про секции только упоминается, причем никакой конкретики. Может быть, плохо искал?
Я тоже не нашел

Цитата(Dopler @ Feb 18 2010, 10:40)

3. Во всех Atmelo'вских примерах и при компиляции и при компоновке вызывается avr32-gcc.exe, причем параметры конкретно линкеру передаются через Wl. Почему не принято вызывать, например, линкер на прямую, зачем в этом случае прослойка в виде gcc.exe?
Она знает кучу параметров по умолчанию, которые в противном случае пришлось бы указывать вручную. Для AVR, например, в зависимости от выбранного типа процессора она компилятору определяет кучу служебных символов (__HAS_RAMPZ и подобные), а линкеру подставляет нужный скрипт, нужный файл стартапа. В общем - полезно. В makefile, опять же, вам надо указать путь только к этой программе а она уже сама найдет и нужный препроцессор и компилятор и ассемблер и линкер.
Цитата(Dopler @ Feb 18 2010, 10:40)

4. Используется ли динамическая память в контроллерах (malloc и free), и если используется, то как реализуется менеджер памяти?
Если надо - используется. Конкретную реализацию надо смотреть в потрохах библиотеки (clib, newlib или какая там для AVR32), но с точки зрения программы они все работают так, как описано в стандарте С.
Цитата(Dopler @ Feb 18 2010, 10:40)

5. Что такое отладочная информация (которая включается ключом -g)? Это просто ссылки на файлы с исходным кодом в итоговом elf, или какой-то код идет в прошивку? Почему эклипс периодически при отладке заявляет, что исходник не обнаружен, хотя если нужный файл открыть в ручную, то отладчик по нему отлично шагает?
Это информация и о строках исходного файла соответствующих конкретным ассемблерным командам, и об адресах и типах данных (в том числе и о структурах, классах, и т.д). Эклипс может не находить исходники если elf перемещался в другое место перед отладкой. Там, кажется, пишутся относительные пути.