gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1385Shell 122Rust 77Markdown 682241 Definitions

static: naabu declara link=dynamic (la verdad); el 'glibc' era un espejismo

naabu declaraba link=static y salía dinámica con NEEDED: libdl.so.2, libpthread.so.0, libc.so.6.
Ese libc.so.6 parecía GLIBC dentro de una distro musl — un cuerpo extraño. NO lo es.

CAUSA, y es la inversión contraintuitiva: CGO_ENABLED=0 es quien lo CAUSA, no quien lo evita.
naabu → Mzack9999/gopacket → ebitengine/purego v0.10.0, una FFI SIN cgo que dlopenea libpcap en
runtime. Su internal/fakecgo/zsymbols_linux.go está guardado con //go:build !cgo y hardcodea:

    //go:cgo_import_dynamic purego_malloc         malloc         "libc.so.6"
    //go:cgo_import_dynamic purego_pthread_create pthread_create "libpthread.so.0"
    //go:cgo_import_dynamic purego_dlopen         dlopen         "libdl.so.2"

El linker interno de Go honra esos pragmas ⇒ emite binario dinámico (derrotando link=static) con
esos DT_NEEDED literales. Verificado en el artefacto: CGO_ENABLED=0 y purego v0.10.0 presentes.

NO hay glibc: el rootfs Alpine no tiene NI UN libc.so.6, y el INTERP es musl (se construyó en el
sandbox). La musl los absorbe — su ldso reserva esos nombres y los resuelve a sí misma. Strings
vestigiales, no dependencia real. Corre en musl puro (verificado con bwrap) y escanea de verdad.
OJO: en el laptop  engaña — este host tiene glibc Y musl.

FIX = declarar la verdad. link=static es INALCANZABLE por diseño: purego existe para dlopen, y un
estático no puede dlopen. cgo=true tampoco sirve: el lab liga con -extldflags=-static ⇒ mismo muro,
y lobotomizaría el escaneo SYN en silencio.

DATO DURO: el binario nuevo es BYTE-IDÉNTICO al viejo ⇒ link=static nunca hizo NADA en recetas Go
(go build no lee LDFLAGS con CGO off): era pura declaración falsa. Las demás recetas Go pasan el
audit por accidente — sin purego, CGO_ENABLED=0 da estático natural.

TICKET APARTE (no tocado): naabu no declara libpcap y NO existe recipes/libpcap.toml. El escaneo
SYN —su feature principal— está INERTE hasta que exista. No es expresable en [deps] hoy: no se
linkea, se dlopenea.

Van 5 de 11.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

147e6508c6a2dd65421c1ae874c075a5293c99b4 · by sergio · (3 months ago) · parent e568f7714 · browse the tree at this commit

Semantic delta

No definition changed: this change is text, documentation or data.

1 files · +31 −2

diff --git a/recipes/naabu.toml b/recipes/naabu.toml
index 1d664022..732d82bd 100644
--- a/recipes/naabu.toml
+++ b/recipes/naabu.toml
@@ -12,9 +12,38 @@ commit = "5a0ca8bde91b5bb16213e9e8b5c6871eac954bd8"
 [build]
 compiler = "zig-cc"
 target   = "x86_64-linux-musl"
-link     = "static"
+# DINÁMICO A PROPÓSITO (no es deuda: es la única opción correcta). Auditado 2026-07-17.
+#
+# naabu depende (vía github.com/Mzack9999/gopacket) de github.com/ebitengine/purego, una FFI
+# SIN cgo que hace `dlopen("libpcap.so.1")` EN RUNTIME. Dos consecuencias encadenadas:
+#
+# 1. `link = "static"` es INALCANZABLE: un binario estático no puede dlopen(). Declararlo
+#    static no lo vuelve estático — sólo silencia el escaneo SYN (su feature principal) en
+#    runtime. Preferimos la verdad declarada al veredicto cómodo.
+#
+# 2. El NEEDED se ve ANÓMALO (libc.so.6 / libpthread.so.0 / libdl.so.2 = nombres GLIBC en una
+#    distro musl) pero NO hay glibc de por medio. La inversión es contraintuitiva: es
+#    CGO_ENABLED=0 el que los CAUSA. purego/internal/fakecgo/zsymbols_linux.go está guardado
+#    con `//go:build !cgo` y hardcodea los sonames:
+#        //go:cgo_import_dynamic purego_malloc malloc "libc.so.6"
+#        //go:cgo_import_dynamic purego_pthread_create pthread_create "libpthread.so.0"
+#        //go:cgo_import_dynamic purego_dlopen dlopen "libdl.so.2"
+#    El linker interno de Go honra esos pragmas ⇒ emite el binario dinámico con esos DT_NEEDED
+#    literales. El INTERP sí es musl (/lib/ld-musl-x86_64.so.1): se construyó en el sandbox.
+#    En runtime musl los absorbe: su ldso (dynlink.c, "reserved names") bloquea recargar la
+#    implementación de libc y resuelve los tres a SÍ MISMO. Verificado en el rootfs Alpine,
+#    que no tiene ningún libc.so.6:
+#        libdl.so.2 => /lib/ld-musl-x86_64.so.1
+#        libc.so.6  => /lib/ld-musl-x86_64.so.1
+#    ⇒ son strings vestigiales, no una dependencia glibc real. El binario corre en musl puro.
+#
+# `cgo = true` NO es el arreglo: excluiría los pragmas (files !cgo), pero el lab lo liga con
+# `-extldflags=-static` ⇒ vuelve al problema (1), estático sin dlopen.
+link     = "dynamic"
 flags    = ["./cmd/naabu"]  # varios mains en el repo; fijo el CLI real
 
-# buildInputs de nix (no usados con CGO off): go, libpcap
+# buildInputs de nix: go, libpcap. libpcap NO va en deps: no se linkea, se dlopenea en runtime
+# (ver arriba) y no hay receta libpcap en el corpus todavía. El escaneo SYN queda inerte hasta
+# que exista; el escaneo connect (`-s c`, Go puro) funciona sin ella.
 [deps]
 build = ["go"]