UpStream/AsNeeded: различия между версиями

Материал из ALT Linux Wiki
(Import from freesource.info)
 
(→‎Ссылки: added PLD link, thx php-coder@)
 
(не показано 11 промежуточных версий 4 участников)
Строка 1: Строка 1:
[[Category:Devel]]
{{Викифицировать}}
{{MovedFromFreesourceInfo|AltLinux/Sisyphus/devel/UpStream/AsNeeded}}
'''ld и --as-needed'''
 
== ld и --as-needed ==


=== Проблема ===
=== Проблема ===
Многие upstream makefiles приводят к избыточной линковке библиотек и бинарников с библиотеками, которые ими не используются напрямую или вообще. Множественные обсуждения, порой баталии, по поводу необходимости борьбы с такими случаями можно найти [http://search.altlinux.ru/ в архивах] по словам "libdb4" или "as-needed", как правило, с участием Dmitry V. Levin; см. тж. [http://lists.altlinux.org/pipermail/devel/2006-March/030044.html это письмо] Andrei Bulava, или [http://lists.altlinux.org/pipermail/devel/2006-March/030110.html объяснение] про LDFLAGS vs LDADD; вот обзор [http://lists.altlinux.org/pipermail/devel/2006-March/030154.html ещё одной типичной возникшей проблемы] и, наконец, развёрнутая [http://lists.altlinux.org/pipermail/devel/2006-March/030208.html аргументация] с демонстрацией 5% выигрыша по времени загрузки спорного <tt>gdm</tt>.
Многие upstream makefiles приводят к избыточной линковке библиотек и бинарников с библиотеками, которые ими не используются напрямую или вообще. Множественные обсуждения, порой баталии, по поводу необходимости борьбы с такими случаями можно найти в [http://lists.altlinux.org/ архивах] по словам «libdb4» или «as-needed», как правило, с участием Dmitry V. Levin; см. тж. [http://lists.altlinux.org/pipermail/devel/2006-March/030044.html это письмо] Andrei Bulava, или [http://lists.altlinux.org/pipermail/devel/2006-March/030110.html объяснение] про LDFLAGS vs LDADD; вот обзор [http://lists.altlinux.org/pipermail/devel/2006-March/030154.html ещё одной типичной возникшей проблемы] и, наконец, развёрнутая [http://lists.altlinux.org/pipermail/devel/2006-March/030208.html аргументация] с демонстрацией % выигрыша по времени загрузки спорного <tt>gdm</tt>.


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


=== Решение ===
=== Решение ===
'''Исправить сборку так, чтобы библиотеки (<tt>-lsomelib</tt>) шли в строке запуска линкера ''после'' объектных файлов (<tt>somemodule.o</tt>). Пример "на пальцах" можно найти [http://lists.altlinux.ru/pipermail/devel/2006-March/029701.html тут].'''
'''Исправить сборку так, чтобы библиотеки (<tt>-lsomelib</tt>) шли в строке запуска линкера ''после'' объектных файлов (<tt>somemodule.o</tt>). Пример «на пальцах» можно найти [http://lists.altlinux.ru/pipermail/devel/2006-March/029701.html тут], вкратце:'''
<font color="red">'''-'''<tt>-lz zv.o</tt></font>
<font color="blue">'''+'''<tt>zv.o -lz</tt></font>


В случае использования проектом autotools доковыривание до источника проблемы в [[UpStream/Makefile.am|Makefile.am]] может быть не совсем интересным занятием, но в моих (mike@) случаях вполне успешным. В случае неиспользования и отсутствия в самописном Makefile строчки линковки в явном виде -- см. [http://lists.altlinux.org/pipermail/sisyphus/2006-October/087186.html здесь] или сразу ''info make в области implicit rules'' (damir@) и <tt>s/LDFLAGS/LDLIBS/</tt>.
В случае использования проектом autotools доковыривание до источника проблемы в Makefile.am может быть не совсем интересным занятием, но в моих (mike@) случаях вполне успешным. В случае неиспользования и отсутствия в самописном Makefile строчки линковки в явном виде см. [http://lists.altlinux.org/pipermail/sisyphus/2006-October/087186.html здесь] или сразу ''info make в области implicit rules'' (damir@) и <tt>s/LDFLAGS/LDLIBS/</tt>.
 
Поищите ''использование'' переменной LINK в получившемся Makefile и загляните в Makefile.am, чтобы выяснить, в какую переменную ''до'' объектов засунули <tt>-l*</tt> вместо того, чтобы воспользоваться одной из тех, что задействованы в «хвосте» строчки линковки.


raorn@ также предлагает (**cleanup** by mike@):
raorn@ также предлагает (**cleanup** by mike@):
Строка 23: Строка 25:
# ...</pre>
# ...</pre>


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


Однако есть [http://lists.altlinux.ru/pipermail/devel/2006-May/032465.html мнение], что в такои виде эту конструкцию использовать вредно. Лучше вызвать <tt>subst</tt> вручную, проверить результат и сделать патч, который уже прикладывать в spec-файле.
Однако есть [http://lists.altlinux.ru/pipermail/devel/2006-May/032465.html мнение], что в таком виде эту конструкцию использовать вредно. Лучше вызвать <tt>subst</tt> вручную, проверить результат и сделать патч, который уже прикладывать в spec-файле.


Если получилось -- хорошо бы [http://lists.altlinux.org/pipermail/devel/2006-March/030047.html отослать разработчикам] исправление (см. тж. [http://lists.altlinux.org/pipermail/devel/2006-March/030017.html этот комментарий] и ещё один [http://lists.altlinux.org/pipermail/devel/2006-September/036882.html аргумент для апстрима]). Также (c) damir@:
Если получилось хорошо бы [http://lists.altlinux.org/pipermail/devel/2006-March/030047.html отослать разработчикам] исправление (см. тж. [http://lists.altlinux.org/pipermail/devel/2006-March/030017.html этот комментарий] и ещё один [http://lists.altlinux.org/pipermail/devel/2006-September/036882.html аргумент для апстрима]). Также (c) damir@:


<pre>1. Explicit linking dynamic objects with all dso it needs ensures
<pre>1. Explicit linking dynamic objects with all dso it needs ensures
Строка 46: Строка 48:
%configure [...]</pre>
%configure [...]</pre>


=== См. тж. ===
=== См. также ===
info ld, искать --as-needed; man ldd; info readelf
* info ld, искать --as-needed; man ldd; info readelf
''[http://lists.altlinux.org/pipermail/devel/2008-April/072664.html ldv@ в devel@]''
* [http://lists.altlinux.org/pipermail/devel/2008-April/072664.html ldv@ в devel@]


=== Ссылки ===
=== Ссылки ===
Строка 56: Строка 58:
* [http://lists.altlinux.ru/pipermail/sisyphus/2006-July/084838.html http://lists.altlinux.ru/pipermail/sisyphus/2006-July/084838.html]
* [http://lists.altlinux.ru/pipermail/sisyphus/2006-July/084838.html http://lists.altlinux.ru/pipermail/sisyphus/2006-July/084838.html]
* [http://lists.altlinux.org/pipermail/devel/2007-March/043183.html http://lists.altlinux.org/pipermail/devel/2007-March/043183.html] (оценка результатов для Sisyphus)
* [http://lists.altlinux.org/pipermail/devel/2007-March/043183.html http://lists.altlinux.org/pipermail/devel/2007-March/043183.html] (оценка результатов для Sisyphus)
* http://blog.flameeyes.eu/2008/06/07/some-more-useful-information-about-as-needed
* http://www.gentoo.org/proj/en/qa/asneeded.xml
* http://www.pld-linux.org/DevelopingPLD/AdvancedDeveloping/FixingAsNeeded
{{Category navigation|title=Upstream|category=Upstream|sortkey={{SUBPAGENAME}}}}

Текущая версия от 09:48, 15 июня 2010

42px-Wikitext-ru.svg.png
Эту статью следует викифицировать.

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). Пример «на пальцах» можно найти тут, вкратце:

--lz zv.o
+zv.o -lz

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

Поищите использование переменной LINK в получившемся Makefile и загляните в Makefile.am, чтобы выяснить, в какую переменную до объектов засунули -l* вместо того, чтобы воспользоваться одной из тех, что задействованы в «хвосте» строчки линковки.

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

%prep
# ...
subst 's,LDFLAGS=\(.*\)\$LDFLAGS\(.*\(LIBS\|-l\).*\),LIBS=\1$LIBS\2,' configure.*

%build
autoreconf -fisv
# ...

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

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

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

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.

Объезд

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

export LDFLAGS="$LDFLAGS -Wl,--no-as-needed"
%configure [...]

См. также

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

Ссылки