[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