Вы обирать бинарного после связывания с -flto
(она должна быть обеспечена как при компиляции и во время компоновки)?
Кстати, уведомление thatже оптимизация флаги (-flto -Os
) должны быть переданы как во время компиляции и во время связи. Если вы забыли - как вы это сделали - любой из них на этапе связывания, LTO не будет работать! (При использовании make
вы хотите CC=gcc -flto -Os
не CFLAGS= -flto -Os
).
Ты забыл -Os
на ссылку времени, в дополнение из -flto
; проездом -flto
во время компоновки без каких-либо оптимизаций неправильно: фаза LTO бы «де-оптимизируют» в большинстве
Я знаю, что -flto
добавляет много секций в объектных ELF-файлов и исполняемых файлов (эти разделы содержат сериализации внутренних представлений GCC, таких как Gimple ....). Я предполагаю (но не проверял), что ссылка не удаляет их.
Кроме того, основная точка LTO является инлайн accross несколько единиц компиляции и это, как ожидается, вырастет код. Поэтому, возможно, вам не следует использовать LTO в вашем конкретном случае.
Большинство избыточных функций уже удалены (компоновщиком «GC» на разделах) даже без LTO.
BTW, вы можете использовать objdump
или readelf
, чтобы узнать.
Как именно вы используете '-flto'? Покажите команды компиляции .... И дает нам более подробную информацию (версия компилятора). Вы попытались с недавним GCC (т. Е. 4.9.1, сентябрь 2014 года)? –
Если вы используете -O3 (сделайте быстрый, но больший код), LTO предоставит компилятору больше возможностей сделать код быстрее (и больше). Если вы используете -Os (создаете небольшие двоичные файлы), LTO предоставляет вам больше возможностей для сокращения размера кода. –
@MarcGlisse Спасибо, но я уже использую опцию -Os, иначе прошивка не будет входить в 64kb. – Muis