[devel] libtool: la_LIBADD vs noinst_LIBRARIES
Alexey Tourbin
=?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Ср Фев 4 00:35:22 MSK 2004
Здравствуйте.
Для тех, кто не в курсе, краткая справка: libtool -- это wrapper для
компилятора и линкера для упрощенного создания библиотек.
Псевдо-библиотека libtool имеет суффикс .la (пресловутые .la files).
Псевдо-библиотеке соответствуют статическая .a и динамическая .so
библиотеки. Сборка этих двух типов библиотек автоматически выполняются
с разными флагами компиляции (для динамических библиотек генерируется
т.н. position independent code с помощью -fPIC).
Таким образом, одни и те же библиотечные исходники компилируются
дважды (если не отключить статическую сборку). По умолчанию
используются динамические библиотеки, для которых PIC code дает
заметное преимущество. Для статических библиотек и executables PIC code
дает небольшой проигрыш.
Теперь обратим внимание на пакет mpfc (music player for console).
$ cat mpfc-1.1.1/plugins/effect/echo/Makefile.am
lib_LTLIBRARIES = libecho.la
libdir = $(prefix)/lib/mpfc/effect
libecho_la_SOURCES = echo.c
INCLUDES = -I$(top_builddir)/src
libecho_la_LIBADD = $(top_builddir)/src/util/libutil.a \
$(top_builddir)/src/cfg/libcfg.a
$
Здесь мы видим, что "полноценная" libtool библиотека libecho.la как в
статическом, так и в динамическом виде линкуется со вспомогательными
статическими библиотеками libutil.a и libcfg.a.
$ cat mpfc-1.1.1/src/util/Makefile.am
noinst_LIBRARIES = libutil.a
libutil_a_SOURCES = util.c ../util.h
localedir = $(datadir)/locale
DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@
INCLUDES = -I$(top_builddir)/src
$
Здесь мы видим, что библиотека libutil.a действительно является
вспомогательной и не предназначена для установки (noinst_LIBRARIES),
а предназначена только для статической компоновки в libecho.la и в
некоторые другие библиотеки этого пакета.
Таким образом, by design, в этом пакете статический non-piс код
(libutil.a) будет "подмешиваться" в динамические библиотеки
(libecho.so). Соответственно, такие динамические библиотеки не будут
проходить проверку brp-verify_elf.
К чести libtool надо сказать, что в таких ситуациях он выдает честное
предупреждение:
*** Warning: Linking the shared library libecho.la against the
*** static library ../../../src/util/libutil.a is not portable!
К "стыду" разработчиков надо сказать, что пакет mpfc не один подвержен
этой напасти (сегодня я ещё исправил flac и буду дальше заниматься этим
вопросом).
Теперь предлагаю обсудить варианты решения проблемы:
1) Можно изменить структуру пакета (возможно, увеличив число полноценных
библиотек и исключив вспомогательные статические библиотеки).
2) Обнаружив вспомогательные статические библиотеки, можно "насильно"
заставить их собираться с -fPIC примерно следующим образом:
%configure
%__subst -p 's/%optflags/& %optflags_shared/g' .../Makefile
%make_build
Я пока предпочел второй вариант.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип : application/pgp-signature
Размер : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20040204/5f2f22dd/attachment-0001.bin>
Подробная информация о списке рассылки Devel