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:
+6
-1
@@ -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
|
# 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.
|
# cairo, appstream y adwaita-hello. `expat` entra por el `.pc` de dbus.
|
||||||
[deps]
|
[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"]
|
||||||
|
|||||||
+7
-1
@@ -31,5 +31,11 @@ configure = './configure prefix=/usr CONFIG_ALSA=y CONFIG_PULSE=n CONFIG_JACK=n
|
|||||||
compile = 'make'
|
compile = 'make'
|
||||||
install = 'make DESTDIR=/out install'
|
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]
|
[deps]
|
||||||
build = ["ncurses", "ffmpeg", "alsa-lib", "pkgconf"]
|
build = ["ncurses", "ffmpeg", "alsa-lib", "pkgconf"]
|
||||||
|
runtime = ["ncurses-shared"]
|
||||||
|
|||||||
Reference in New Issue
Block a user