Требования к использованию 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.)

Другие вопросы по тегам