International conference of developers
and users of free / open source software

Set-версии

Vladimir D. Seleznev, Москва, Russian Federation

LVEE 2019

Shared libraries are one of the important part of Linux distribution ecosystems. One of biggest problem is to guarantee the ABI consistency in the package repository and while system updates as well. Shared library is described by its soname and contains exported symbols. To make a program work, dynamic linker should be able to load all needed shared library and resolve symbols used by the program. RPM packages have dependecies, installed system should have all installed packages with satisfied dependencies (i.e. it should not contain unmets). Same is true for package repositories: consistent one contains no unmets. During the package build rpm-build calculates needed and provided sonames for of packaged ELFs and these information is placed in package provided and required dependencies. But originally it did nothing to symbols that is exported or used by ELFs. Provided all these information in package dependencies would be too expensive. Too keep information about ELF symbols in package dependencies, ALT Linux Team introduced new type of RPM dependency: set-versions, based on complementary hashing. It's a way to hash two sets R and P that it is able to check is R a subset of P. It was mainly developed by Alexey Tourbin in 2010.

Разделяемые библиотеки — важная часть экосистемы дистрибутивов Linux.

Разделяемые библиотеки очень легко создавать (в тривиальном случае надо передать опцию компилятору -shared), но сложно сопровождать стабильное ABI, что является одни из источников проблем. Поломку ABI очень легко пропустить, что неоднократно подтверждалось на практике.

Часть мер предосторожности можно предпринять на уровне репозитория: обнаруживать несовместимые изменения ABI до того, как пакет попадёт в репозиторий, удостоверяться, что все клиенты, которые используют интерфейсы библиотеки связаяны с этой библиотеков, и что ничто нет перелинковки.

На работающей системе во время установки пакетов можно проверять, что все необходимые разделяемые библиотеки предоставлены, равно как и предоставлены необходимые веросионирования интерфейсов. Также нужно удостовериться, что все неходимые символы, требуемые от разделяемой библиотеки, она предоставляет. Первое решение, которое можно было бы предожить, это записать в предоставляемые зависимости пакетов все символы, которые экспортируют разделяемые библиотеки, упакованные в данные пакеты, а в требуемые зависимостм этой библиотеки записать все неопределённые символы ELF’ов, упакованных в них. Очевидным недостатком этого решения будет то, что зависимости пакетов станут чрезмерно большими, а разрешение зависимостей — чрезмено доглим. В зависимостях можно связать символы с именем билиотеки (SONAME), которая их экспортирует, тогда надо будет убедиться, что требуемые символы являются подмножеством предоставляемых для разрешения зависимостей. Но такое решение всё ещё слишком тяжёлое.

Вместо множества имён символов реализовать функции хэширования этих множеств и проверки того, что одно множество входит в другое. Такая схема реализована в rpm, используемом в системах ALT, опирающаяся на схему комплементарного хэширования.

Список литературы

Abstract licensed under Creative Commons Attribution-ShareAlike 3.0 license

Back