Unversioned Dynamic Shared Objects
The standard policy is to have versioned SONAMES for all dynamic shared objects (DSO). Packagers SHOULD
work with upstreams that do not have versioned SONAMES to enable this capability. This is a hard requirement if the DSO is being linked between different software.
This policy helps to ensure ABI compatibility when DSOs are dynamically linked between different software.
When Are Unversioned Dynamic Shared Objects Acceptable
There are a few conditions that need to exist in which DSOs are allowed to remain unversioned.
-
The DSO
MUST NOT
be visible to the dynamic linker (i.e. the DSO does not show up inldconfig -p
output) -
The DSO
MUST
be located in a private directory (i.e. not located directly in /usr/lib[64] or in another directory listed as a library path for the linker) -
The DSO
MUST NOT
be linked against and is loaded at runtime by the implementing application (i.e.dlopen()
)
If these conditions are met, the unversioned DSOs do not need to be placed in a -devel package.
Implementation Details
Listed below is information for each known use-case for unversioned DSOs. Evaluate if your situation matches any of these and ask for any clarification by opening a ticket with the {packaging-committee}.
Vulkan
The Vulkan ecosystem continues to grow in capabilities and adoption. One of the core concepts is the Vulkan Loader. This component is responsible for initializing the stack and includes loading unversioned DSOs, called Drivers and Layers.
Vulkan Drivers need to be visible to the default loader and are a special exception.
Drivers have the following requirements:
-
The DSO
SHOULD
be located in a private directory in /usr/lib[64] (i.e.%{_libdir}/%{name}/driver
) -
The directory
SHOULD
be added to the loader path using ald.conf.d
configuration (i.e.%{_sysconfdir}/ld.conf.d/%{name}.conf
definition)
Vulkan Layers are loaded by configuration as defined by the Vulkan Loader specification.
Layers have the following requirements:
-
The DSO
MUST
be located in a private directory in /usr/lib[64] (i.e.%{_libdir}/%{name}/layer
) and loaded by configuration
OpenXR
The OpenXR ecosystem enables users to run XR applications built against the SDK. One of the core concepts is the OpenXR Loader. This component is responsible for initializing the stack and includes loading unversioned DSOs, called Runtimes and Layers.
OpenXR Runtimes are loaded by configuration as defined by the OpenXR Loader specification.
Runtimes have the following requirements:
-
The DSO
MUST
be located in a private directory in /usr/lib[64] (i.e.%{_libdir}/%{name}/runtime
) -
The directory
SHOULD
be added to the loader path using ald.conf.d
configuration (i.e.%{_sysconfdir}/ld.conf.d/%{name}.conf
definition)
OpenXR Layers are loaded by configuration as defined by the OpenXR Loader specification.
Layers have the following requirements:
-
The DSO
MUST
be located in a private directory in /usr/lib[64] (i.e.%{_libdir}/%{name}/layer
) and loaded by configuration
Other Cases
An example of another case is an unversioned DSO that is loaded at runtime within the same application. This allows an application to load an optional feature, ship modular capabilities, or otherwise dlopen()
it’s own capabilities. These are allowed as long as the main requirements are met.
Want to help? Learn how to contribute to Fedora Docs ›