Размер кода удваивается при компиляции с GCC ARM Embedded?

Я только что перенес проект микроконтроллера STM32 из Keil uVision (используя Keil ARM Compiler) в CooCox CoIDE (используя GCC ARM Embedded compiler).

Проблема в том, что размер кода — это двойной размер при компиляции в CoIDE с GCC по сравнению с Keil uVision.

Как это может быть? Что я могу сделать?

Размер кода в Keil: 54632b (.text)
Размер кода в CoIDE: 100844b (.text)

Флаги компилятора GCC:

arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -g2 -Wl,-Map=project.map -Os
-Wl,--gc-sections -Wl,-TC:\arm-gcc-link.ld -g -o project.elf -L -lm

Я подозреваю, что CoIDE и GCC скомпилируют множество функций и файлов, которые присутствуют в проекте, но не используются (пока). Возможно ли, что он компилирует целые файлы, даже если я использую там только 1 функцию из 20? (хотя у меня есть -О)

3

Решение

Трудно сказать, какие файлы действительно скомпилированы / связаны в вашем конечном двоичном файле из информации, которую вы предоставляете. Я предполагаю, что он берет все файлы C, которые он находит в вашем проекте, если вы не указали явно, какой из них нужно скомпилировать, или если вы не используете свой собственный Makefile.

Но из опций компилятора, которые вы даете, флаг компоновщика --gc-sections не будет много мусора, если у вас нет следующих флагов компилятора: -ffunction-sections -fdata-sections, Попробуйте добавить эти параметры, чтобы удалить все неиспользуемые функции и данные во время соединения.

1

Другие решения

Поскольку вопрос был помечен C ++, мне интересно, хотите ли вы отключить исключения и RTTI. Те занимают совсем немного кода. добавлять -fno-exceptions -fno-rtti на флаги компоновщика.

0