LINUX.ORG.RU

еще раз о LTO

 , , , ,


2

4

вкратце:
после очередного добавления пакета в package.env с no-lto решил разобраться чего ж ему не хватает для сборки

после гугления и курения манов стало ясно что добавления -flto в CFLAGS не достаточно
и даже -flto -fuse-linker-plugin не достаточно
оно то работает, но работает «через Ж»:

man gcc

When -fuse-linker-plugin is not enabled then, when a file is compiled with -flto, the generated object file is larger than a regular object file because it contains GIMPLE bytecodes and the usual final code (see -ffat-lto-objects).

кароче что-то где-то когда-то пошло не так, и этот самый linker-plugin не подхватывается автоматом

гугль говорит:
* сделать руками симлинки в дефолтную директорию плагинов
* переключить дефолтный плагин линкера через binutils-config --linker ld.gold
* юзать врапперы gcc-ar, gcc-nm, gcc-ranlib (что, собсна, я для себя и выбрал, чтоб рулить этим всем в no-lto)

добавил в make.conf:

AR=/usr/bin/gcc-ar
NM=/usr/bin/gcc-nm
RANLIB=/usr/bin/gcc-ranlib
вполне вероятно что я где-то тоже через Ж все это выстроил, но то что раньше добавлял в no-lto начало собираться с -flto нормально

также решил проверить на недавно собранной «старым» методом либе:
-flto:
$ equery s -b dev-cpp/gtkmm
 * dev-cpp/gtkmm-2.24.4-r2
         Total files : 458
         Total size  : 7672046
AR,NM,RANLIB:
$ equery s -b dev-cpp/gtkmm
 * dev-cpp/gtkmm-2.24.4-r2
         Total files : 458
         Total size  : 7663334
no-lto:
$ equery s -b dev-cpp/gtkmm
 * dev-cpp/gtkmm-2.24.4-r2
         Total files : 458
         Total size  : 8836542
вот такая-вот фигня

з.ы.

https://wiki.gentoo.org/wiki/Gold

Warning
The gold linker was known to cause breakage of grub2, causing the system to become unbootable. Proceed with caution.

★★★★

более забавно, что lto снижал производительность пакетов, на которых я его тестировал

anonymous
()
Ответ на: комментарий от wakuwaku

Какой реальный профит кроме в пару раз меньших бинарников?

дык, оптимизация же идет не по каждому объектнику отдельно, а при линковке
что дает больше профита (теоретически)
ну и отжырает больше ресурсов при компиляции тоже :)

anTaRes ★★★★
() автор топика
Ответ на: комментарий от anonymous

более забавно, что lto снижал производительность пакетов, на которых я его тестировал

тут хз, нужно самому проверить
есть варианты что можно быстро пересобрать в разных режимах и потестить (чтоб я не искал)?

anTaRes ★★★★
() автор топика

еще такой нюанс:
во многих пакетах всякие AR= захардкожены

RANLIB=ranlib
AR=ar
ткчто тут не особо порулишь через окружение, нужно патчи писать или ebuild'ы править (или таки включить ld.gold дефолтным линкером(?))

anTaRes ★★★★
() автор топика
Ответ на: комментарий от anTaRes

включить ld.gold дефолтным линкером

можно, у меня на ~amd64 из всего фэйлится только sys-fs/fuse, а grub2 нормально работает

anonymous
()

Последние несколько месяцев использую ld.gold дефолтом, правда без lto. Некоторые пакеты фейлят с характерными ошибками. Переключаю вручную на ld.bfd, собираю проблемный пакет, переключаю обратно и возобновляю сборку. Заметил и обратное. Иногда пакет фейлит с ld.bfd, но собирается с ld.gold. С аналогичными ошибками.

lto несколько раз пытался включить, но так и не осилил.

eternal_sorrow ★★★★★
()
Последнее исправление: eternal_sorrow (всего исправлений: 1)
Ответ на: комментарий от eternal_sorrow

включил ld.gold пытаясь собрать mail-mta/postfix, у которого AR=ar - не помогло
пришлось юзерпатч сделать, где поудалял все эти AR= из мейка

при переключении линкера ld стал симлинком на ld.gold, но сборка фейлится с ошибками bfd

по идее в генте должен быть механизм чтоб переключать дефолтные ar,nm... на gcc-ar, gcc-nm ... (или на clang'овские, если такие есть)
нужно почитать багзилу, может уже кто-то поднимал вопрос
если нет, возможно позже сам запилю баг-репорт

anTaRes ★★★★
() автор топика

это всё уже не актуально?

#gcc 4.7
dev-libs/elfutils gcc-wolto
media-sound/wavpack gcc-wolto
media-video/dirac gcc-wogte
media-libs/alsa-lib gcc-wolto
media-libs/mesa gcc-wolto
x11-base/xorg-server gcc-wolto
dev-lang/spidermonkey gcc-wolto
app-emulation/virtualbox gcc-wolto
dev-util/valgrind gcc-wolto
x11-libs/wxGTK gcc-wolto
media-gfx/imagemagick gcc-wolto
app-text/rarian gcc-wolto
sys-block/partitionmanager gcc-wolto
sys-devel/clang gcc-wolto
www-client/chromium gcc-wolto no-tmpfs
app-emulation/qemu gcc-wolto
#
sys-apps/sandbox gcc-wolto
sys-apps/coreutils gcc-wolto
sys-devel/binutils gcc-wolto
#gcc 4.8.0
sys-apps/groff gcc-minopt
dev-libs/glib gcc-wolto
sys-libs/gpm gcc-minopt
sys-apps/gawk gcc-wolto
sys-libs/pam gcc-wolto
#?
sys-devel/libtool gcc-minopt
sys-devel/bison gcc-minopt
sys-libs/readline gcc-minopt
sys-libs/ncurses gcc-minopt
app-arch/bzip2 gcc-minopt
sys-devel/llvm gcc-minopt
app-shells/bash gcc-minopt
dev-libs/openssl gcc-minopt
#?
sys-apps/findutils gcc-wolto
#
#other lto graphite related
app-office/akonadi-server gcc-minopt
dev-qt/qtcore gcc-minopt
dev-qt/qtdbus gcc-minopt
dev-qt/qtgui gcc-minopt
dev-qt/qtscript gcc-minopt
dev-qt/qtsql gcc-minopt
dev-qt/qtwebkit gcc-minopt
dev-util/codeblocks gcc-minopt
kde-base/kdelibs gcc-minopt
dev-python/PyQt4 gcc-minopt
kde-base/kwin gcc-wolto gcc-Os
kde-apps/okular gcc-wolto
kde-apps/okteta gcc-wolto
#
dev-util/kdevelop gcc-minopt
dev-util/kdevelop-pg-qt gcc-minopt
dev-util/kdevelop-python gcc-wolto
dev-lang/lua gcc-minopt
#4.9 gcc fun again
#dev-lang/perl gcc-minopt
dev-db/sqlite gcc-O3 gcc-lto
#dev-db/mariadb gcc-O3 no-tmpfs
#here goes
dev-libs/libaio gcc-minopt_weak
<sys-devel/gcc-4.9.0 gcc-minopt_weak
#
#sys-libs/libselinux gcc-minopt
#sys-libs/libsemanage gcc-minopt
#sys-apps/shadow gcc-wolto
#sys-apps/man-db gcc-wolto

wakuwaku ★★★★
()
Последнее исправление: wakuwaku (всего исправлений: 3)

И всё таки, как правильно включать LTO? Нужен ли -fuse-linker-plugin или достаточно -flto? Нужно ли вносить изменения в LDFLAGS или только в CFLAGS? Нужно ли использовать ld.gold? Нужно ли делать симлинк в папку плагинов? Насчёт gcc-ar, gcc-ranlib и т.д. вообще впервые слышу.

eternal_sorrow ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Нужен ли -fuse-linker-plugin или достаточно -flto?

Нужен в случае ld.bfd. Не мешает в случае ld.gold.

Нужно ли вносить изменения в LDFLAGS или только в CFLAGS?

Нужно в случае ld.bfd. Не мешают в случае ld.gold.

Нужно ли использовать ld.gold?

Необходимо. Или по умолчанию, или через флаг -fuse-linker-plugin.

Насколько я распарсил, -flto генерирует GIMPLE bytecodes, так что он обязателен. -fuse-linker-plugin задействует ld.gold независимо от типа ld по умолчанию. gcc-ar и т.п. определяют наличие GIMPLE bytecodes в объектных файлах/библиотеках и, в зависимости от, вызывают нужный ld. Пусть меня поправят, если что не так.

pS
()
Ответ на: комментарий от eternal_sorrow

И всё таки, как правильно включать LTO?

$ man gcc

/-flto\[=n\]

эта секция и ниже
еще есть -fuse-ld=, нужно будет попробовать
но пока у меня только переменные с враперами в make.conf и -flto -fuse-linker-plugin в CFLAGS, так работает

anTaRes ★★★★
() автор топика
Ответ на: комментарий от eternal_sorrow

кароче, ни переключение линкера, ни симлинки, ни флаги не помогли
BFD ругается при сборке, а должен голд
вот так только:

CFLAGS="-march=native -O2 -flto -pipe"
CXXFLAGS="${CFLAGS}"

# for LTO
AR=/usr/bin/gcc-ar
NM=/usr/bin/gcc-nm
RANLIB=/usr/bin/gcc-ranlib
а CFLAGS и так в генте попадает в LDFLAGS, ткчто дополнительно можно не указывать -flto и пр.

разве что хочется замутить финт с компиляцией -O0 и линковкой -O2/-O3
что вроде как логично для LTO, но выдает то еще меньший размер накомпиленного, то процентов на 15 больший для разных пакетов (по сравнению с собранными -O2 -flto)

anTaRes ★★★★
() автор топика
Ответ на: комментарий от anTaRes

а CFLAGS и так в генте попадает в LDFLAGS

Это гарантировано? Где описано?

Есть ещё вопрос: эта gimple информация только в объектных файлах, или в выполняемых тоже болтается? Если да, то как её обнаружить?

pS
()
Последнее исправление: pS (всего исправлений: 1)
Ответ на: комментарий от pS

Это гарантировано? Где описано?

ну, некоторые девелоперы «лучше знают» как компилять их проги и сами подставляют нужные флаги игнорируя CFLAGS и LDFLAGS
ткчто не гарантировано :)

а так - чисто визуально при компиляции видно что при линковке добавляются

Есть ещё вопрос: эта gimple информация только в объектных файлах, или в выполняемых тоже болтается? Если да, то как её обнаружить?

https://gcc.gnu.org/wiki/GIMPLE
https://gcc.gnu.org/wiki/LinkTimeOptimization
что есть в объектниках можно посмотреть через readelf или objdump

anTaRes ★★★★
() автор топика
Ответ на: комментарий от eternal_sorrow

Нужен ли -fuse-linker-plugin или достаточно -flto?
Нужно ли использовать ld.gold?

при использовании -flto флаг -fuse-linker-plugin включается автоматом (но на всякий случай лучше указывать)

This option is enabled by default when LTO support in GCC is enabled and GCC was configured for use with a linker supporting
           plugins (GNU ld 2.21 or newer or gold).
НО gcc использует тот линкер что установлен по умолчанию в системе, как оказалось
в моем случае это bfd (он по умолчанию везде ставится)
и при использовании враперов все нормально собирается с bfd

чтоб заставить gcc юзать gold нужно -fuse-ld=gold
т.е. можно делать так:
-flto -fuse-linker-plugin -fuse-ld=gold для LTO, чтоб наверняка
либо переключить линкер в системе

anTaRes ★★★★
() автор топика
Ответ на: комментарий от anTaRes

я реально задолбался фиксить все что насильно использует ar/nm/ranlib при сборке :)
причем некоторые пакеты таки собираются втихаря, хоть и ругаются что нужен плагин (случайно заметил)

поэтому делаю СУПЕРКОМБО:

# ln -s /usr/libexec/gcc/x86_64-pc-linux-gnu/5.2.0/liblto_plugin.so.0.0.0 /usr/x86_64-pc-linux-gnu/binutils-bin/lib/bfd-plugins
и удаляю враперы из make.conf (#AR=/usr/bin/gcc-ar ...)
с ld.gold тоже работает, не смотря на название (bfd-plugins)

мораль: делай как написано, даже если кажется что предложенный метод кривой, и тебе хочется сделать по феншую (это я про http://marxin.github.io/posts/gentoo-linux-packages-with-gcc-4-dot-9-lto/)

-- ССЗБ

anTaRes ★★★★
() автор топика
Ответ на: комментарий от anTaRes

ещё можно добавлять -fno-fat-lto-objects, чтобы точно валилось, если используются не-gimple объектники

anonymous
()
Ответ на: комментарий от anonymous

дык, в мане написано что это по умолчанию

The default is -fno-fat-lto-objects on targets with linker plugin support.

anTaRes ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.