De las 4, sólo 2 eran mentiras reales. Las otras 2 eran ARTEFACTOS RANCIOS: el audit hace
`ls -dt store/*-<n>` = el sellado MÁS RECIENTE, que no es el VIGENTE (hammer no expone el hash de
una receta sin construirla — no hay 'hammer hash' ni dry-run). Con el store desactualizado, el
audit acusa a recetas ya sanas. El propio script lo advierte ('correr DESPUÉS del rebuild, nunca
antes') y aun así la lista del frente se armó sin re-sellar. => el '11 mienten' está INFLADO;
hay que re-sellar antes de asumir que cada una necesita fix.
pcre2 — mentira real de libtool. NEEDED libz.so.1+libc.so → 0. -all-static en compile Y install.
pcre2grep 10.47 corre y matchea de verdad ('foo bar' con 'b(a|o)r').
libcap — mentira real, pero la causa NO era libtool: Makefile plano, -all-static no aplica.
progs/Makefile ASIGNA `LDFLAGS = -Wl,-Bstatic` + sufijo `-Wl,-Bdynamic`, y una asignación del
makefile PISA el LDFLAGS=-static del lab. El comentario de upstream admite que su default es
'estático contra libcap.a, DINÁMICO contra libc'. Fix = LIBCSTATIC=yes, la palanca que upstream
expone justo para esto (la usa su kdebug/test-kernel.sh) ⇒ rama con `LDFLAGS = --static` sin
sufijo. NO se pasa LDFLAGS por línea de comando: pisaría la rama y devolvería el sufijo.
NEEDED=0; capsh/getcap/setcap corren y getpcaps devuelve caps reales.
dbus — no mentía. Construye con MESON, no libtool ⇒ el agujero no existe acá. Ya tenía
--prefer-static -Ddefault_library=static: libdbus-1.a, cero .so, todos los binarios NEEDED=0.
Verificado end-to-end: dbus-run-session levantó un daemon estático y dbus-send ListNames obtuvo
method return. Sólo se documentó.
libnl — no mentía. Ya tenía --disable-shared --enable-static --disable-cli: 0 .so, 6 .a, sin
ejecutables (es el 'sin ELF: 1' del audit, esperado). libnl-3.a válido con nl_connect/
nl_socket_alloc como T. Sólo se documentó.
LECCIÓN: -all-static no es la única causa. Hay paquetes que pisan LDFLAGS por asignación de
makefile (libcap) y otros que ya están bien. Hay que LEER el Makefile, no aplicar el patrón a ciegas.
Van 9 de 11 (2 eran falsos positivos).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Cosecha desatendida de la campaña harkaq. Cada dep de acá la denunció el audit de
Landlock en un build real: el kernel vio al build usarla sin declararla, y el
store del hub confirma qué artefacto la provee (deuda DECLARABLE, §4.5).
Recetas:gettext-tiny giflib git gnupg gperf gzip htop iproute2 jq kbd libassuan libcap libevent libffi libgcrypt libgpg-error libksba libnl libpng libsass libsodium libssh2 libudev-zero libusb libwebp libxml2 libyaml linux-generic linux-headers linux-metal linux-pam linux lz4 mandoc mtools musl nano npth openssh openssl parted pciutils pcre2 pigz procps-ng python3 readline rsync samurai ca-certificates curl doas dosfstools e2fsprogs fontconfig freetype
No se tocó ninguna receta con deuda IRREDUCIBLE: declarar algo que el store no
provee rompería el build en vez de arreglarlo. Esas van a tandas/needs-review-harkaq.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Cuarta pieza del toolchain hammer-from-source (variante b, SDD 11 §7.2b): bubblewrap, el
sandbox del propio lab. Binario estático ⇒ swap de archivo sobre /toolchain/usr/bin/bwrap.
Como herramienta del toolchain (no input del 4/4) no necesita casar byte-a-byte con Alpine,
sólo aislar igual.
Tres piezas:
- recipes/libcap.toml (2.78): dep obligatoria de bwrap; el toolchain Alpine no trae el -dev
(libcap.a / sys/capability.h). Build estático musl con zig cc, sin patches (es tool, no input).
- materialización de build-deps (hammer-build): deps.build ahora se CONSTRUYE recursivamente
(build() llama build() por cada dep) y cada artefacto sellado se apila como capa --overlay-src
bajo el rootfs del sandbox, dejando usr/{include,lib,lib/pkgconfig} en /usr. pkgconf y zig cc
las hallan sin plumbing de flags. Recetas sin deps: sandbox byte-igual (baseline intacto).
Tests nuevos: no_deps_emits_single_overlay_src, deps_stack_as_overlay_layers_under_rootfs.
- recipes/bwrap.toml (0.11.0): el toolchain no trae meson/ninja/python, así que bypaseamos meson
compilando los 4 .c de bubblewrap directo con zig cc (+config.h trivial). deps.build=["libcap"].
Validación host fuerte: hammer-bwrap es estático, corre --version y sandboxea, y musl rebuildeó
BYTE-IDÉNTICO usándolo de sandbox (bisección). Expuesto con SWAP_BWRAP=1. Tests verdes.
Pendiente: corrida in-VM acumulando swaps para el sello ✓ REPRODUCIBLE.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>