Skip to content

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) and libonedal_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.