Case 84: Multi-library bundle SONAME skew¶
| Field | Value |
|---|---|
| Verdict | ๐ด BREAKING |
| Category | Breaking |
| Platforms | Linux |
| Flags | ABI break, Bad practice |
Detected ChangeKinds |
bundle_soname_skew |
| Source files | browse on GitHub |
Category: Cross-artifact ABI | Verdict: BREAKING
What breaks¶
oneDAL ships as a co-versioned bundle:
libonedal_core.so.X
libonedal_thread.so.X
libonedal_sequential.so.X
libonedal_parameters.so.X
libonedal_dpc.so.X
libonedal_sycl.so.X
They are intended to move SONAME in lockstep. The break case84 encodes:
release engineering bumps five of the six (.so.1 โ .so.2) but
libonedal_thread.so.1 keeps the old SONAME by accident. Each library on
its own passes per-library ABI checks. The bundle does not:
- Distro packages declare
Depends: libonedal-core2, libonedal-thread1โ internally inconsistent. - A binary linked against v1 finds
libonedal_thread.so.1(still installed) andlibonedal_core.so.2(the only one available) โ the two were built against different internal contracts, leading to corruption at the first cross-library call.
Layout¶
Unlike the other cases, this one has no single v1.cpp/v2.cpp pair. Instead
v1 and v2 are directories containing multiple .so files:
case84_bundle_soname_skew/
โโโ v1/
โ โโโ libonedal_core.so.1
โ โโโ libonedal_thread.so.1
โ โโโ libonedal_dpc.so.1
โโโ v2/
โโโ libonedal_core.so.2
โโโ libonedal_thread.so.1 <-- soname-laggard
โโโ libonedal_dpc.so.2
The compare-release mode of abicheck ingests both directories and runs
the cross-library aggregator.
Why this is its own ChangeKind¶
Existing soname_changed and soname_bump_recommended are per-library
signals. The skew is a property of the set of libraries; no individual
artifact is wrong. A new BUNDLE_SONAME_SKEW ChangeKind in
BREAKING_KINDS reports the cohort-level invariant: "five siblings bumped,
one did not."
How abicheck detects it¶
abicheck/bundle_soname.py runs after compare-release collects per-pair
results. It extracts each library's SONAME major from both releases,
clusters libraries by a configurable cohort prefix (default: longest
common prefix among bundle members), and emits one BUNDLE_SONAME_SKEW
finding when a cohort has mixed soname deltas (some bumped, some not).
Source files for the example: see gen_bundle.sh for the script that
produces the .so files. The CMake integration wires this up under the
abicheck_add_bundle_case macro.
Source files¶
See also: Examples overview ยท All BREAKING cases ยท Category: Breaking.