From db002ede659989d5a6144f34ab228897ed061a10 Mon Sep 17 00:00:00 2001 From: Sergio Date: Mon, 31 Aug 2026 14:54:58 +0000 Subject: [PATCH] htop: `link = "static"` era mentira por el `-rdynamic` de upstream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QUINTA causa del frente link=static, y la unica que no es culpa de la receta: `Makefile.am:243` hace `AM_LDFLAGS += -rdynamic` bajo `if HTOP_LINUX`, y el wrapper de cc del lab (`sandbox.rs:597`) quita el `-static` inyectado ante `-rdynamic`/`--export-dynamic`/un `.so` en la linea. La regla del wrapper es correcta —`-static` no se sostiene contra un link intrinsecamente dinamico—, pero el `-rdynamic` de htop es solo para simbolizar el backtrace del manejador de fallos, no una necesidad de enlace. Efecto que tenia: `-lncursesw` resolvia a la libncursesw.so.6 DEL ROOTFS de Alpine en vez del artefacto de ncurses (que solo trae .a) — una entrada no declarada, de las que rompen el cono de affected.py. `AM_LDFLAGS=-static` va en compile Y en install: si `make install` relinkea sin el override devuelve el binario dinamico (la leccion de parted). Seguro: el UNICO dlopen del arbol esta en linux/LibSensors.c y la receta ya pasa --disable-sensors; delayacct queda en `no` por no estar libnl en [deps]. Control: NEEDED=0 en todos los ejecutables ELF, y la lista de ficheros del artefacto no perdio nada contra el sellado anterior. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01ACUcwo9mZsE5ocYVE9npih --- recipes/htop.toml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/recipes/htop.toml b/recipes/htop.toml index 4d3d5951..e82c5335 100644 --- a/recipes/htop.toml +++ b/recipes/htop.toml @@ -27,10 +27,23 @@ link = "static" # Split de la info de depuración (SDD 23 etapa 4, tanda de HOJAS). Entra en `hash_inputs`. strip_debug = true +# `AM_LDFLAGS=-static` en compile Y en install — la QUINTA causa de que `link = "static"` mienta, +# y la única que NO es culpa de la receta: `Makefile.am:243` hace `AM_LDFLAGS += -rdynamic` bajo +# `if HTOP_LINUX`, y el wrapper de cc del lab (`sandbox.rs:597`) quita el `-static` inyectado ante +# `-rdynamic`/`--export-dynamic`/un `.so` en la línea. La regla del wrapper es correcta —`-static` +# no puede sostenerse contra un link intrínsecamente dinámico—, pero acá el `-rdynamic` de upstream +# es sólo para simbolizar el backtrace del manejador de fallos, no una necesidad de enlace. Con +# `-static` el backtrace pierde nombres; es exactamente lo que `link = "static"` ya pedía. +# Resultado sin esto: `-lncursesw` resolvía a la `libncursesw.so.6` DEL ROOTFS de Alpine — una +# entrada no declarada, que es lo que el audit destapó (2026-08-31, 4 mintiendo). +# En `install` no es opcional: si `make install` relinkea sin el override, devuelve el binario +# dinámico y el arreglo se pierde (la lección de `parted`). +# Seguro porque el ÚNICO `dlopen` del árbol está en `linux/LibSensors.c` y acá va `--disable-sensors`; +# delayacct (que usaría libnl) queda en `no` por no estar libnl en `[deps]`. [build.phases] configure = "./configure --build=$CBUILD --host=$CHOST --prefix=/usr --sysconfdir=/etc --mandir=/usr/share/man --enable-cgroup --enable-taskstats --disable-sensors" -compile = "make -j\"$(nproc)\"" -install = "make DESTDIR=/out install" +compile = "make -j\"$(nproc)\" AM_LDFLAGS=-static" +install = "make DESTDIR=/out install AM_LDFLAGS=-static" [deps] build = ["binutils", "ncurses", "linux-headers", "make"]