В чем разница в gcc между lto и fat-lto-objects

Я попытался скомпилировать мой исходный код на ассемблере с помощью следующих флагов:
1. -flto
2. -flto -ffat-lto-objects
3. -flto -fno-fat-lto-objects

Третий обеспечивает оптимизированный slim Код LTO, как написано в документации, но я не вижу никакой разницы в выходном файле сборки между первым и вторым, почему?

ОС: Linux
Компилятор: GCC 4.7

2 ответа

Решение

Разница между толстыми и нежирными объектными файлами заключается в том, что толстые объектные файлы содержат как промежуточный язык, так и нормально скомпилированный код. Во время компоновки, если вы вызываете компилятор без -flto, толстые объекты будут обрабатываться как обычные объектные файлы (и информация LTO отбрасывается), в то время как тонкие объекты будут инициировать оптимизаторы LTO, потому что без них невозможно обработать их.

Если вы скомпилируете и скомпонуете с -flto, то и толстые, и тонкие объекты должны давать вам один и тот же двоичный файл, только тонкие объекты будут меньше и быстрее компилироваться, потому что вы избежите создания избыточного кода.

Наверное, это будет кому-то полезно
Здесь написал следующее:
The current implementation only produces “fat” objects, effectively doubling compilation time and increasing file sizes up to 5x the original size

Так что, как мне кажется, это главная причина.

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