Re: [sisyphus] Re: пережёвываем libtool

Dmitry Kazimirov =?iso-8859-1?q?d=2Ekazimirov_=CE=C1_olivema=2Ecom?=
Пт Апр 8 16:25:34 MSD 2005


> А существует ли совсем правильная замена libtool?

Уоу оу оу. Стоп. Кто сказал, что libtool поступает неправильно,
используя файлы *.la для того, чтобы включить в зависимости
собираемой библиотеки (исполняемого файла) все используемые
ей (им) библиотеки, которые не были перечислены явно при
линковке? Ведь в общем случае правильно поступать именно так.

Рассмотрим такую вот ситуацию:

1. Библиотека BASE предоставляет некоторый интерфейс для
  доступа к объекту, описываемому структурой BASE_STRUCT.
  Пусть, например, sizeof(BASE_STRUCT) = 8.
  Пусть есть метод base_initialize(BASE_STRUCT*).
  Пусть эта библиотека имеет libtool version info 3:4:1.

2. Библиотека BASE_UTIL предоставляет дополнительные
  функции по управлению объектами, описанными структурой
  BASE_STRUCT (например, упрощенный интерфейс для доступа
  к ним). Версия BASE_UTIL - 1:5:0.

2. Приложение APP использует библиотеку BASE_UTIL для
  простого управления объектами BASE_STRUCT. Приложение
  APP собирается при помощи libtool без файла libBASE_UTIL.la.
  Тогда в зависимости APP не будет включена библиотека
  libBASE.so.2, а только libBASE_UTIL.so.1.

Теперь представим, что автор библиотеки BASE увеличил размер
структуры BASE_STRUCT, добавив какой-нибудь указатель и
sizeof(BASE_STRUCT) = 12, поэтому base_initialize заполняет 12
байт. Зная, что полученная библиотека несовместима с
предыдущими версиями, автор увеличил номер интерфейса
библиотеки. Теперь её libtool version info - 4:0:0.

А вот автор библиотеки BASE_UTIL не подумал о том, что
интерфейс его библиотеки опосредованно изменился (не заметил,
был невнимателен, посчитал это неправильным или что-то еще),
и не увеличил version info до 2:0:0.

Что же мы имеем? Библиотека BASE_UTIL опакетилась и стала
требовать libBASE.so.4, но ее версия не изменилась, и
приложение APP по-прежнему захочет исползовать
libBASE_UTIL.so.1, которая, например, будучи загруженной в
приложение вместо приложением восьми байт неожиданно
проинициализирует 12, и т. д. Короче, приложение упадет.
А все потому, что приложение APP не имело прямой зависимости
от BASE, хотя использовала ее через BASE_UTIL.

Так что у *.la файлов есть определенные плюсы, и уж точно
не стоит искать "более правильную" замену libtool.

Следует отметить, что есть множество причин, по которым
описанная ситуация будет происходить очень редко, так что
в Сизифе можно экономить на трафике, исключая непрямые
зависимости. Ведь при создании дистрибутива, я думаю, всё равно
все включаемые в него пакеты будут пересобраны. Однако в
будущем описанная проблема может возникнуть при обновлении
некоторых пакетов дистрибутива из Сизифа. Например, libBASE...rpm
и libBASE_UTIL...rpm обновятся по зависимости друг от друга, а
приложение из APP...rpm будет падать, если его не обновить из
Сизифа вручную (так как зависимость от неизменившейся
интерфейсной версии libBASE_UTIL...rpm) не будет требовать
обновления.




Подробная информация о списке рассылки Sisyphus