[sisyphus] lib API changes
Andrei Bulava
=?iso-8859-1?q?abulava_=CE=C1_altlinux=2Eru?=
Чт Ноя 18 18:36:20 MSK 2004
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-файлов вручную.
Так понятнее?
--
// AB1002-UANIC
Подробная информация о списке рассылки Sisyphus