Требования к использованию flto
Если я хочу скомпилировать свой проект с -flto
Достаточно ли, чтобы построить GCC с --enable-gold
или мне тоже нужно собрать золото и заменить на него ld? И мне нужны какие-нибудь другие флаги? Т.е. я делаю это
gcc -flto one.c two.c
1 ответ
Согласно https://gcc.gnu.org/wiki/LinkTimeOptimization,
Несмотря на название "время ссылки", LTO не нуждается в использовании каких-либо специальных функций компоновщика. Основной необходимый механизм - это обнаружение разделов GIMPLE внутри объектных файлов. В настоящее время это реализовано в
collect2
, Поэтому LTO будет работать на любом компоновщике, уже поддерживаемом GCC.
Кроме того, документация GCC для -fuse-linker-plugin
говорит:
Эта опция включена по умолчанию, когда включена поддержка LTO в GCC, и GCC был настроен для использования с компоновщиком, поддерживающим плагины (GNU ld 2.21 или новее или gold).
Так что тебе не нужно gold
вообще, даже если вы хотите использовать специальную функцию "компоновщика плагинов" для сбора информации об оптимизации из объектных файлов в архивах библиотеки.
Есть примеры использования в -flto
документация Или
gcc -o myprog -flto -O2 foo.c bar.c
или же
gcc -c -O2 -flto foo.c
gcc -c -O2 -flto bar.c
gcc -o myprog -flto -O2 foo.o bar.o
буду работать.
Начиная с GCC 4.9, вам даже не нужно -flto
для связи:
Единственная важная вещь, которую нужно иметь в виду, состоит в том, что для оптимизации времени соединения необходимо использовать драйвер GCC для выполнения шага соединения. Затем GCC автоматически выполняет оптимизацию во время соединения, если какой-либо из задействованных объектов был скомпилирован с
-flto
,
И по состоянию на GCC 5:
В отличие от более ранних выпусков GCC, параметры оптимизации и назначения, передаваемые в командной строке ссылки, игнорируются.
Я не могу найти ничего в документах, чтобы подтвердить это, но экспериментально LTO включается, только если включен некоторый уровень оптимизации компилятора. Так добавь -O
в командной строке, и вы увидите результаты LTO.
(Я думаю, именно поэтому -O2
является частью всех примеров man-страниц gcc для -flto
.)