Неверсионные динамические разделяемые объекты

Стандартная политика заключается в наличии версионных SONAME для всех динамических разделяемых объектов (DSO). Упаковщикам СЛЕДУЕТ сотрудничать с upstream-проектами, у которых нет версионных SONAME, чтобы включить эту возможность. Это жёсткое требование, если DSO компонуется между различным программным обеспечением.

Эта политика помогает обеспечить совместимость ABI, когда DSO динамически компонуются между различным программным обеспечением.

Когда неверсионные динамические разделяемые объекты допустимы

Существует несколько условий, которые должны выполняться, чтобы DSO могли оставаться неверсионными.

  • DSO НЕ ДОЛЖЕН быть видимым для динамического компоновщика (то есть DSO не отображается в выводе ldconfig -p)

  • DSO ДОЛЖЕН находиться в приватном каталоге (то есть не располагаться непосредственно в /usr/lib[64] или в другом каталоге, указанном как путь библиотек для компоновщика)

  • DSO НЕ ДОЛЖЕН компоноваться и загружается во время выполнения приложением-реализатором (то есть dlopen())

Если эти условия выполнены, неверсионные DSO не нужно помещать в пакет -devel.

Детали реализации

Ниже приведена информация для каждого известного сценария использования неверсионных DSO. Оцените, соответствует ли ваша ситуация какому-либо из них, и запросите разъяснения, открыв тикет в Fedora Packaging Committee.

Vulkan

Экосистема Vulkan продолжает расти в возможностях и степени внедрения. Одной из ключевых концепций является Vulkan Loader. Этот компонент отвечает за инициализацию стека и включает загрузку неверсионных DSO, называемых драйверами и слоями.

Драйверы Vulkan должны быть видимы для загрузчика по умолчанию и являются особым исключением.

Драйверы имеют следующие требования:

  • DSO СЛЕДУЕТ размещать в приватном каталоге в /usr/lib[64] (то есть %{_libdir}/%{name}/driver)

  • Каталог СЛЕДУЕТ добавить в путь загрузчика с помощью конфигурации ld.conf.d (то есть определения %{_sysconfdir}/ld.conf.d/%{name}.conf)

Слои Vulkan загружаются посредством конфигурации, как определено спецификацией Vulkan Loader.

Слои имеют следующие требования:

  • DSO ДОЛЖЕН находиться в приватном каталоге в /usr/lib[64] (то есть %{_libdir}/%{name}/layer) и загружаться посредством конфигурации

OpenXR

Экосистема OpenXR позволяет пользователям запускать XR-приложения, собранные на основе SDK. Одной из ключевых концепций является OpenXR Loader. Этот компонент отвечает за инициализацию стека и включает загрузку неверсионных DSO, называемых средами выполнения и слоями.

Среды выполнения OpenXR загружаются посредством конфигурации, как определено спецификацией OpenXR Loader.

Среды выполнения имеют следующие требования:

  • DSO ДОЛЖЕН находиться в приватном каталоге в /usr/lib[64] (то есть %{_libdir}/%{name}/runtime)

  • Каталог СЛЕДУЕТ добавить в путь загрузчика с помощью конфигурации ld.conf.d (то есть определения %{_sysconfdir}/ld.conf.d/%{name}.conf)

Слои OpenXR загружаются посредством конфигурации, как определено спецификацией OpenXR Loader.

Слои имеют следующие требования:

  • DSO ДОЛЖЕН находиться в приватном каталоге в /usr/lib[64] (то есть %{_libdir}/%{name}/layer) и загружаться посредством конфигурации

Другие случаи

Примером другого случая является неверсионный DSO, который загружается во время выполнения в рамках того же приложения. Это позволяет приложению загружать дополнительную функцию, поставлять модульные возможности или иным образом dlopen() свои собственные возможности. Это разрешено при условии соблюдения основных требований.