Вход:  Пароль:  
FreeSource: AltLinux/Sisyphus/devel/UpStream/AsNeeded ...
Free Source | Каталог | Изменения | НовыеКомментарии | Пользователи | Регистрация |
Эта страница была перенесена на altlinux.org. Текст на freesource.info заморожен.

ld и --as-needed

Проблема

Многие upstream makefiles приводят к избыточной линковке библиотек и бинарников с библиотеками, которые ими не используются напрямую или вообще. Множественные обсуждения, порой баталии, по поводу необходимости борьбы с такими случаями можно найти в архивах по словам “libdb4” или “as-needed”, как правило, с участием Dmitry V. Levin; см. тж. это письмо Andrei Bulava, или объяснение про LDFLAGS vs LDADD; вот обзор ещё одной типичной возникшей проблемы и, наконец, развёрнутая аргументация с демонстрацией 5% выигрыша по времени загрузки спорного gdm.


С марта 2006 в ALT Linux наблюдается ld -Wl,--as-needed по умолчанию.

Решение

Исправить сборку так, чтобы библиотеки (-lsomelib) шли в строке запуска линкера после объектных файлов (somemodule.o). Пример «на пальцах» можно найти тут.


В случае использования проектом autotools доковыривание до источника проблемы в Makefile.am может быть не совсем интересным занятием, но в моих (mike@) случаях вполне успешным. В случае неиспользования и отсутствия в самописном Makefile строчки линковки в явном виде — см. здесь или сразу info make в области implicit rules (damir@) и s/LDFLAGS/LDLIBS/.


raorn@ также предлагает (**cleanup** by mike@):


Смысл этой странной конструкции состоит в том, что все ссылки на библиотеки (-lfoo) должны помещаться в переменнуюю LIBS, а не LDFLAGS, как это иногда ошибочно делается.


Однако есть мнение, что в такои виде эту конструкцию использовать вредно. Лучше вызвать subst вручную, проверить результат и сделать патч, который уже прикладывать в spec-файле.


Если получилось — хорошо бы отослать разработчикам исправление (см. тж. этот комментарий и ещё один аргумент для апстрима). Также (c) damir@:


Объезд

Если же это изменение поведения по умолчанию привело к слишком дорогим/странным в оперативной починке поломкам, возможен откат на старое поведение:

См. тж.

info ld, искать --as-needed; man ldd; info readelf
ldv@ в devel@

Ссылки


Страницы, ссылающиеся на данную: AltLinux/Sisyphus/devel/TypicalPackagingErrors/LinkingError
AltLinux/Team/Famous


 
Файлов нет. [Показать файлы/форму]
Комментарии [Скрыть комментарии/форму]

Кстати, есть подозрение, что заметно невооружённому глазу помогает с использованием памяти. Текущий сизиф весьма неплохо ездит на ноутбуке четырёхлетней давности в качестве терминального сервера :-)

-- MichaelShigorin (2006-09-29 11:41:01)

<ASY> wRAR: ну pastebin и тормоз... http://pastebin.com/800570 в общем там по циклу идет перепол по вариантам bdb в надежде найти что-нибудь.
<wRAR> ASY: это ком тормоз
<wRAR> всё ясно.
<wRAR> ASY: еще тут?
<wRAR> ладно, в общем диктую.
<wRAR> записывайте на вику кто-нить
<wRAR> если configure не находит что-то, от чего 100% есть девелы, глядим в config.log. обычно там есть такая строка:
<wRAR> configure:3700: cc -o conftest -lfoo conftest.c >&5
<wRAR> здесь -lfoo должен стоять после conftest.c. как правило, это из-за криво написанного теста
<wRAR> пример я щас показать не могу, но там обычно AC_TRY_LINK, окруженный сохранением и восстановлением CFLAGS и т.д.
<wRAR> в том числе там есть сохранение старых LDFLAGS, запись в них -lfoo, и после AC_TRY_LINK восстановление saved_LDFLAGS
<wRAR> так вот здесь ошибка, т.к. использовать надо LIBS
<wRAR> поэтому ищем этот кусок (по -lfoo проще всего) либо в configure.ac, либо в *.m4, либо в каком-нить macros/*.m4
<wRAR> s/LDFLAGS/LIBS/ и autoreconf
<wRAR> должно съесть

-- MichaelShigorin (2006-10-05 12:57:23)

Миша, Дамир сформулировал выжимку из дискусий вокруг --as-needed которую, ИМХО, стоит опубликовать в самом начале этой твоей странички.
1, Explicit linking dynamic objects with all dso it needs ensures
correct soname dependencies and prevent ABI incompatibilities.


2. Unused direct dependencies encumber package with extra dependencies
(including soname dependencies). An encumbered program takes more time
to load (5% in case of gdm for example), and need more memory mapped
to its address space.


An encumbered package requires extra packages when installed, and
needs extra care when one of unused libraries was updated and its
soname was changed.

-- 10.254.200.6 (2007-02-02 14:15:07)