Set-версии
LVEE 2019
Разделяемые библиотеки — важная часть экосистемы дистрибутивов Linux.
Разделяемые библиотеки очень легко создавать (в тривиальном случае надо передать опцию компилятору -shared
), но сложно сопровождать стабильное ABI, что является одни из источников проблем. Поломку ABI очень легко пропустить, что неоднократно подтверждалось на практике.
Часть мер предосторожности можно предпринять на уровне репозитория: обнаруживать несовместимые изменения ABI до того, как пакет попадёт в репозиторий, удостоверяться, что все клиенты, которые используют интерфейсы библиотеки связаяны с этой библиотеков, и что ничто нет перелинковки.
На работающей системе во время установки пакетов можно проверять, что все необходимые разделяемые библиотеки предоставлены, равно как и предоставлены необходимые веросионирования интерфейсов. Также нужно удостовериться, что все неходимые символы, требуемые от разделяемой библиотеки, она предоставляет. Первое решение, которое можно было бы предожить, это записать в предоставляемые зависимости пакетов все символы, которые экспортируют разделяемые библиотеки, упакованные в данные пакеты, а в требуемые зависимостм этой библиотеки записать все неопределённые символы ELF’ов, упакованных в них. Очевидным недостатком этого решения будет то, что зависимости пакетов станут чрезмерно большими, а разрешение зависимостей — чрезмено доглим. В зависимостях можно связать символы с именем билиотеки (SONAME), которая их экспортирует, тогда надо будет убедиться, что требуемые символы являются подмножеством предоставляемых для разрешения зависимостей. Но такое решение всё ещё слишком тяжёлое.
Вместо множества имён символов реализовать функции хэширования этих множеств и проверки того, что одно множество входит в другое. Такая схема реализована в rpm, используемом в системах ALT, опирающаяся на схему комплементарного хэширования.
Список литературы
- [DSO howto] Ulrich Drepper. How To Write Shared Libraries.
- Dmitry V. Levin. Set-versioned package dependencies addressing the problem of shared library updates.
- 2010 Алексей Турбин. Комплементарное хэширование подмножеств.
Abstract licensed under Creative Commons Attribution-ShareAlike 3.0 license
Назад