recetas: cmus y bluez piden un .so que la imagen no llevaba — declarado en runtime

Se descubrió CORRIENDO los binarios, no auditando las recetas, y el hash NO se mueve (las deps de
runtime no entran en hash_inputs): los artefactos sellados siguen valiendo.

  cmus/cmus            NEEDED libncursesw.so.6   ⇒ runtime = ["ncurses-shared"]
  bluez/bluetoothctl   NEEDED libreadline.so.8   ⇒ runtime = ["readline-shared"]

Las canónicas `ncurses` y `readline` del corpus son `--without-shared`/sólo `.a`, así que sin
declarar la variante `-shared` esos `.so` no viajan en la imagen y el binario muere en el loader.
Es la MISMA fuga que el perfil de sway ya pagó con zlib/expat/libffi, y no la ve ningún auditor de
recetas: sólo `readelf -d` sobre el artefacto, o ejecutarlo.

El reparto de bluez era el peor posible: `bluetoothd` sale con `libc.so` a secas y habría
arrancado, y la herramienta con la que se emparejan los dispositivos habría sido la que no.

Comprobado con scripts/provee.py: los dos sonames SÍ los publica el corpus
(corpus/ncurses-shared, corpus/readline-shared) ⇒ no hay NEEDED colgante, faltaba la declaración.
This commit is contained in:
Sergio
2026-09-12 20:45:58 +00:00
parent e1fb4b71a7
commit 4fe5886447
2 changed files with 13 additions and 2 deletions
+5
View File
@@ -54,3 +54,8 @@ restart = { initial_ms = 500, max_ms = 20000 }
# cairo, appstream y adwaita-hello. `expat` entra por el `.pc` de dbus.
[deps]
build = ["glib", "dbus", "readline", "ncurses", "pkgconf", "pcre2", "libffi", "zlib", "expat"]
# ⚠ `readline-shared` EN RUNTIME, descubierto corriendo el binario y no auditando la receta:
# `bluetoothctl` sale `NEEDED libreadline.so.8` y la `readline` canónica del corpus es sólo `.a`.
# `bluetoothd` no lo pide (sale con `libc.so` a secas), así que el demonio arrancaría y la
# herramienta con la que se emparejan los dispositivos NO — el peor reparto posible.
runtime = ["readline-shared"]
+6
View File
@@ -31,5 +31,11 @@ configure = './configure prefix=/usr CONFIG_ALSA=y CONFIG_PULSE=n CONFIG_JACK=n
compile = 'make'
install = 'make DESTDIR=/out install'
# ⚠ `ncurses-shared` EN RUNTIME, Y SE DESCUBRIÓ CORRIENDO EL BINARIO. El artefacto sale
# `NEEDED libncursesw.so.6` (el resto —ffmpeg, alsa— sí entra estático, son `.a`), y la `ncurses`
# canónica del corpus es `--without-shared`: sin declarar la variante `-shared`, la imagen no lleva
# ese `.so` y cmus muere en el loader. Es exactamente la fuga que el perfil de sway ya pagó con
# zlib/expat/libffi, y no la ve ningún auditor de recetas — sólo `readelf -d` sobre el artefacto.
[deps]
build = ["ncurses", "ffmpeg", "alsa-lib", "pkgconf"]
runtime = ["ncurses-shared"]