[sisyphus] lib API changes
=?iso-8859-1?q?led_=CE=C1_ukr-fin=2Ecom=2Eua?=
=?iso-8859-1?q?led_=CE=C1_ukr-fin=2Ecom=2Eua?=
Чт Ноя 18 19:06:42 MSK 2004
В сообщении от Четверг 18 Ноябрь 2004 17:36 Andrei Bulava написал(a):
> led на ukr-fin.com.ua пишет:
> > В сообщении от Четверг 18 Ноябрь 2004 16:22 Andrei Bulava написал(a):
> >>led на ukr-fin.com.ua пишет:
> >>>Например, libXaw.so.8
> >>
> >>Что в этом криминального? В ALM 2.4 libXaw.so.7, в текущем Sisyphus -
> >>libXaw.so.8. Если авторы xorg изменили ABI этой библиотеки (и поменяли
> >>soname вследствие этого), то всё абсолютно корректно - приложения,
> >>слинкованные с libXaw.so.8 с большой долей вероятности будут иметь
> >>unresolved symbols при попытке запуска в системе с libXaw.so.7.
> >>
> >>При этом API могло и не менятся, т.е. пересборка в среде с libXaw.so.7
> >>тех же самых приложений пройдёт корректно. Но они будут
> >>двоично-несовместимы уже с сизифной libXaw.so.8.
> >
> > А вот здесь поподробнее, плиз... Кто "они", и что значит "будут
> > двоично-несовместимы"? Там что - вызовы из libXaw.so по абсолютному
> > адресу происходят?
>
> Попытаюсь объяснить на пальцАх (подробнее можно прочитать в упомянутом
> надцать раз "How to Write Shared Libraries").
>
> Есть библиотека libfoo.so (это soname - попадаются и такие библиотеки!)
> с API из единственной функции bar ( int ) и есть приложение с вызовом
> функции bar ( x ), динамически слинкованное с библиотекой libfoo.so. В
> один прекрасный день девелоперы libfoo решают, что надо изменить
> сигнатуру функции bar с bar ( int ) на bar ( int, int ), при этом старая
> функция bar ( int ) теперь выражается через bar ( int, int ) как bar (
> int, <константа >). Естественно, чтобы не ломать API, в заголовочных
> файлах libfoo добавляется макрос, подменяющий на этапе препроцессинга
> все вызовы bar ( x ) на bar ( x, <константа> ) - это даёт гарантию, что
> приложения с вызовом bar ( x ) будут без проблем компилироваться с
> "новой" libfoo.so.
>
> Вот и имеем изменение ABI в то время как API "новой" libfoo.so есть
> надмножество API "старой" libfoo.so: теперь приложение, динамически
> слинкованное со "старой" libfoo.so, при запуске с "новой" libfoo.so
> будет иметь неразрешённый символ - ибо двоичный файл "новой" библиотеки
> вообще не содержит функции bar ( int ) !!! И наоборот - если
> перекомпилировать приложение с "новой" libfoo.so - оно не запустится со
> старой, теперь из-за отсутствия функции bar ( int, int ) !!!
>
> Вот тогда и было придумано соглашение о добавлении в soname цифр,
> отражающих изменение ABI, чтобы избежать появления dll hell. Это даёт
> возможность менеджерам пакетов автоматически отслеживать двоичную
> целостность системы без запуска всех исполняемых ELF-файлов вручную.
>
> Так понятнее?
Это понятно:) Вопрос не в терминологии, а в практике: т.н. "автоматика"
поставила зависимость на libXaw.so.8. Вы уверены, что это правильно? ИМХО
нет...
Led.
Подробная информация о списке рассылки Sisyphus