Skip to content

feat(compat): a farm answers for its own members, and reaches the host only through a named package - #380

Merged
Sunrisepeak merged 1 commit into
mainfrom
fix/a-farm-is-its-own-seed-set
Sep 10, 2026
Merged

Sunrisepeak merged 1 commit into
mainfrom
fix/a-farm-is-its-own-seed-set

Conversation

@Sunrisepeak

Copy link
Copy Markdown
Member

Closes #376 — and widens it: the same defect is in three farms, and the issue names the wrong one.

What is wrong

Membership in these farms is decided by a filename pattern. Completeness — where it was checked at all — was decided against a different set: the libraries an ICD manifest names.

The pattern exists because a proprietary driver dlopens members of its own family by name, which no DT_NEEDED walk can see. Having said that, those members must be treated as reachable everywhere else too. They were not. The half of each farm the pattern exists for is the half nothing verified.

Measured on a host with an NVIDIA driver, by mcpp's dlopen-surface check:

farm members unmet closure edges
compat.glx-runtime 52 30 (no closure pass at all)
compat.vulkan-runtime 76 5
compat.opencl-runtime 4 ← what #376 actually observed

#376 is titled against compat.vulkan-runtime; the four findings came from compat.opencl-runtime. Both carry the same members because both use the same vendor pattern.

The reason recorded against the fix measured a different set

compat.vulkan-runtime says closing over the farm pulled 64 libraries with GTK among them. That is true of closing over every file the pattern matchedlibnvidia*.so.* also matches the driver's settings GUI. The farm is the pattern's matches minus never_farm_patterns, and closing over that adds five sonames on this host and no GTK, GLib, Pango or Cairo.

The conclusion had been re-checked; the reason had not.

The rule

Every soname a farmed member needs has a written answer, and there is no silent branch:

  1. the ecosystem publishes it → declared in xpm.linux.deps, taken from the installed payload (xim:openssl, xim:mesa)
  2. proprietary vendor user-space → also a package: xim:nvidia-video-host-link owns the one question "where is the host's libnvcuvid.so.1", the shape libcuda-host-link and nvidia-gl-host-link already have
  3. neither, and it cannot become one → named in UNSERVED with the reason (today: libcrypto.so.1.1 — OpenSSL 1.1 is EOL upstream and only NVIDIA's PKCS#11 provider asks for it)
  4. anything else → a warning naming it at install time

No branch harvests a new file from /usr/lib for a farmed member. compat.glx-runtime harvests none at all: all thirty come from installed payloads — four from xim:nvidia-gl-host-link, twenty-six from the stack xim:graphics pulls in.

The criterion is asked the way mcpp asks it

A member's DT_NEEDED is read with readelf -d, and membership is decided against this directory alone.

ldd was wrong for this: it answers "can this resolve here", and here includes the host's default directories — so a soname the host happens to carry reads as resolved and is never recorded, while the consumer, whose search path is the farm and not the host, cannot load it. Measured: the libcrypto needs were invisible to that pass and were reported by mcpp one layer up, from the same directory.

Measured after

OpenCL farm on this host: members 48, walked 47, missing 0. The one remaining finding is libcrypto.so.1.1, correctly classified dangling — the case declared in UNSERVED. Four missing before.

Ordering and upgrade

  • Merges after feat(nvidia-video-host-link): a fourth sentinel, for the codec user-space openxlings/xim-pkgindex#801, which publishes the sentinel this declares.
  • New version keys (2026.09.10) on all three farms: install() output is baked into the installed payload, so without a new key a host that already holds the previous version keeps the open farm. compat.glfw, compat.opencl and compat.vulkan move their pins with it.
  • mcpp's three examples pin vulkan-runtime = "2026.09.07" and are re-pinned in a follow-up PR there, after this publishes.

…t only through a named package

The membership of these three farms is decided by a filename pattern, and their
completeness -- where it was checked at all -- was decided against a different
set: the libraries an ICD manifest names. The pattern exists because a
proprietary driver dlopens members of its own family by name, which no
DT_NEEDED walk can see; having said that, those members have to be treated as
reachable everywhere else too, and they were not. The half of each farm the
pattern exists for is the half nothing verified.

Measured on a host with an NVIDIA driver, by mcpp's dlopen-surface check:
compat.glx-runtime 52 members / 30 unmet closure edges (it had no closure pass
at all), compat.vulkan-runtime 76 / 5, compat.opencl-runtime / 4 -- the last
being the findings filed as #376, which names vulkan while
the observed four came from opencl.

THE REASON RECORDED AGAINST SEEDING FROM THE FARM MEASURED A DIFFERENT SET. It
says the closure pulled 64 libraries with GTK among them; that holds for closing
over every file the PATTERN matched, since `libnvidia*.so.*` also matches the
driver's settings GUI. The farm is the pattern's matches MINUS
never_farm_patterns, and closing over that adds five sonames here and no GTK,
GLib, Pango or Cairo.

Every soname a member needs now has a written answer and there is no silent
branch:

  * the ecosystem publishes it -> declared in xpm.linux.deps and taken from the
    installed payload (xim:openssl, xim:mesa)
  * proprietary vendor user-space -> also a package: xim:nvidia-video-host-link
    owns "where is the host's libnvcuvid.so.1", the shape libcuda-host-link and
    nvidia-gl-host-link already have
  * neither, and it cannot become one -> named in UNSERVED with the reason
    (libcrypto.so.1.1: OpenSSL 1.1 is EOL upstream and only NVIDIA's PKCS#11
    provider asks for it)
  * anything else -> a warning naming it at install time

No branch harvests a new file from /usr/lib for a farmed member.
compat.glx-runtime harvests none at all: all thirty come from installed
payloads, four from xim:nvidia-gl-host-link and twenty-six from the stack
xim:graphics pulls in.

The criterion is asked the way mcpp asks it: a member's DT_NEEDED is read with
`readelf -d` and membership is decided against this directory alone. `ldd` was
wrong for it -- it answers "can this resolve HERE", and here includes the
host's default directories, so a soname the host happens to carry read as
resolved and was never recorded while the consumer, whose search path is the
farm, could not load it. Measured: the libcrypto needs were invisible to that
pass and were reported by mcpp one layer up from the same directory.

Measured after, on the opencl farm: members 48, walked 47, missing 0, with
libcrypto.so.1.1 the one remaining finding and correctly classified dangling.
Four missing before.

New version keys because install() output is baked into the installed payload:
without one, a host that already holds the previous version keeps the open
farm. compat.glfw, compat.opencl and compat.vulkan move their pins with it.

Depends on openxlings/xim-pkgindex#801, which publishes the sentinel this
declares.
@Sunrisepeak
Sunrisepeak merged commit ffe60ed into main Sep 10, 2026
25 of 27 checks passed
@Sunrisepeak
Sunrisepeak deleted the fix/a-farm-is-its-own-seed-set branch September 10, 2026 04:26
Sunrisepeak added a commit to mcpp-community/mcpp that referenced this pull request Sep 10, 2026
…bers (#601)

* fix(examples, record): follow the farms that answer for their own members

`compat:vulkan-runtime` published a farm whose members needed four sonames
nothing on the artifact's search path carried. The three examples that pin it
moved to 2026.09.10, where the farm closes over its own members and reaches the
host only through a named `*-host-link` package.

Measured on this host, the vulkan example's own record before and after:

    members 55, walked 55, missing 4, dangling 0
    members 60, walked 59, missing 0, dangling 1

The one remaining finding is `libcrypto.so.1.1`, and it is dangling rather than
missing because the publishing package now says so: OpenSSL 1.1 is end-of-life
upstream, the ecosystem publishes 3.x, and only NVIDIA's PKCS#11 provider asks
for it. `libcrypto.so.3` comes from `xim:openssl` and `libnvcuvid.so.1` from
`xim:nvidia-video-host-link`; no branch harvests a new file from /usr/lib.

The example still runs on the device: `12 24 36 48` and
`device: NVIDIA GeForce RTX 4080`.

Section 7 of the design record no longer files those four findings as open. It
records what repairing them found instead: the defect was in three farms rather
than one, mcpplibs/mcpp-index#376 named the wrong one -- the four came from
`compat:opencl-runtime` -- and the reason written against the fix had measured
the set before the driver's settings GUI was excluded.

Follows mcpplibs/mcpp-index#380 and openxlings/xim-pkgindex#801.

* fix(examples): offscreen pins compat.vulkan 1.4.357.1

The example names `compat.vulkan-runtime` itself, under a cfg(linux)
predicate, and compares that pin against the one recorded in its installed copy
of `compat.vulkan`. 1.4.357.0 records 2026.09.07; 1.4.357.1 is the version
whose install records 2026.09.10. See mcpplibs/mcpp-index#381.

---------

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

compat.vulkan-runtime: four farm members cannot load, and the new dlopen-surface check names them

1 participant