From 4fe5886447ec279048ee5e403ce5fadcaf3a3f51 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sat, 12 Sep 2026 20:45:58 +0000 Subject: [PATCH] =?UTF-8?q?recetas:=20cmus=20y=20bluez=20piden=20un=20.so?= =?UTF-8?q?=20que=20la=20imagen=20no=20llevaba=20=E2=80=94=20declarado=20e?= =?UTF-8?q?n=20runtime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- recipes/bluez.toml | 7 ++++++- recipes/cmus.toml | 8 +++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/recipes/bluez.toml b/recipes/bluez.toml index 21c78752..7aa337cf 100644 --- a/recipes/bluez.toml +++ b/recipes/bluez.toml @@ -53,4 +53,9 @@ restart = { initial_ms = 500, max_ms = 20000 } # transitivas de pkg-config hay que materializarlas igual. Es el mismo juego de cuatro que declaran # cairo, appstream y adwaita-hello. `expat` entra por el `.pc` de dbus. [deps] -build = ["glib", "dbus", "readline", "ncurses", "pkgconf", "pcre2", "libffi", "zlib", "expat"] +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"] diff --git a/recipes/cmus.toml b/recipes/cmus.toml index f15289cf..5398e12d 100644 --- a/recipes/cmus.toml +++ b/recipes/cmus.toml @@ -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"] +build = ["ncurses", "ffmpeg", "alsa-lib", "pkgconf"] +runtime = ["ncurses-shared"]