Ответ 1
В более поздних частях этапа оптимизации между процедурами используется обратный снизу график вызова; что порядок, который вы видите. Там есть статья об оригинальном дизайне этой части GCC здесь (с того момента, этот материал впервые появился в GCC 3.4).
Вы можете предотвратить переупорядочение с помощью -fno-toplevel-reorder
(или -fno-unit-at-a-time
для менее поздних версий GCC), но это отключает некоторые связанные с этим оптимизации.