SDD 26: §3.quater — la cadena wasm y las tres cosas que costó

Deja escrito en el documento que se lee para reanudar: el orden obligatorio de
las cinco recetas, por qué wasi-libc-headers pinea un commit viejo a propósito, y
las tres trampas ya pagadas (sesgo de clang en check-symbols, el wasi-libcxx que
faltaba, y el directorio vacío que es una sonda del compilador).

Y el criterio de guardián que sale de todo esto, que es lo más reusable:
«existe» no es «se encuentra».
This commit is contained in:
Sergio
2026-09-06 01:51:20 +00:00
parent cddae46205
commit df4111c57d
+44 -1
View File
@@ -178,6 +178,49 @@ bit-repro; a nosotros nos rompe el invariante. La salida: **generar el perfil UN
artefacto propio, consumido por hash** desde `firefox`. El build optimizado vuelve a ser determinista
aunque su insumo no lo sea, y el perfil se regenera a propósito, no por accidente.
### 3.quater La cadena wasm, y las tres cosas que costó (2026-09-06)
`--without-wasm-sandboxed-libraries` se cambió por `--with-wasi-sysroot=/usr/share/wasi-sysroot`,
que es literalmente el flag de Alpine. Detrás hay cinco recetas nuestras, en este orden obligatorio:
```
wasi-libc-headers → wasi-compiler-rt → wasi-libc → wasi-libcxx → wasi-sdk → firefox
```
`wasi-libc-headers` existe **sólo** para romper el ciclo del bootstrap y pinea un commit VIEJO a
propósito (triple `wasm32-wasi`), mientras `wasi-libc` pinea el nuevo (`wasm32-wasip1`, el que
clang 22.1 usa de verdad). Es lo mismo que hace Alpine y no es un descuido.
**Lo que costó, que es la parte reusable:**
1. **`check-symbols` falla por sesgo de clang, no por un artefacto malo.** El lab trae clang 22.1.8
y el snapshot del árbol viene de uno anterior: sobra `#define __wasip1__ 1` y nada más. Se
reconcilia el snapshot; **no** se salta con `make no-check-symbols`, que se lleva por delante la
comparación de símbolos —la mitad que sí vale y que pasaba byte a byte.
2. **Faltaba `wasi-libcxx`, y el hueco era visible en el grafo sin construir nada.** El configure
murió a los 6 s con `'cstring' file not found`, culpando a los headers de WASI, que estaban
perfectos: `<cstring>` es C++ y las librerías enjauladas no son todas C. El `wasi-sdk` de Alpine
declara `wasi-libc wasi-libcxx wasi-compiler-rt` —TRES— y la cadena tenía dos. **El `depends`
del paquete ajeno equivalente es una comprobación de completitud gratis**, antes de gastar CPU.
3. **Un directorio VACÍO que sí importa.** Con `wasi-libcxx` sellado el configure volvió a morir
igual, y `cstring` estaba en el artefacto: clang no lo buscaba. Falta el `mkdir -p
include/c++/v1` que Alpine tiene en su `package()` y que parece ruido de empaquetado — es la
sonda por la que el driver decide que el sysroot tiene layout de libc++. Medido dentro del lab:
sin ese directorio, `'cstring' file not found`; con él, exit 0. Es el **reverso exacto de la
regla 3 del `CLAUDE.md`**: allá un directorio vacío es un artefacto mentiroso, acá es una
declaración dirigida al compilador.
De ahí sale el criterio de guardián que ahora usan estas recetas: **«existe» no es «se encuentra»**.
`wasi-libcxx` corre hoy la misma prueba que hace el configure de firefox, contra un sysroot
fusionado con el de su dep, así que un fallo aparece en el segundo 20 de una receta chica —con la
lista de búsqueda de clang impresa— y no en el segundo 6 de un build de cuatro horas que además
culpa a otro. Y `firefox` exige RLBox **en el binario**: sobre `b3:352d7880` (el último con RLBox
apagado) los patrones `w2c_`, `rlbox` y `wasm2c` dan cero los tres en `libxul.so`, así que
cualquiera apareciendo prueba que la jaula entró. Es la tercera repetición de la lección de
`MOZ_REQUIRE_SIGNING` y `MOZ_BUILD_DATE`: una bandera que el configure acepta y el artefacto ignora.
## 4. Lo que `atuq` NO promete
Esta sección existe antes que la lista de features a propósito, con el mismo criterio que el modelo
@@ -408,7 +451,7 @@ siguiente.
| 2 | ~~`llvm-toolchain`~~**`apk add lld` + `compiler="clang"`** ✅ 2026-09-05 | LTO **y** el muro 3 | — |
| 3 | Construir el `firefox` con LTO (hash `b3:6f2a3b2f`) | el eje de velocidad **y** las extensiones de `atuq` | 2 ✅ |
| 3.a | PGO: perfil bajo sway headless, **sellado como artefacto propio** y consumido por hash | la otra mitad de la ganancia | 3 |
| 3.b | `wasi-sdk` + `wasi-compiler-rt` ⇒ RLBox encendido | cierra el hueco de seguridad del §3.bis | 2 |
| 3.b | **RLBox ENCENDIDO** ✅ 2026-09-06 — cadena wasm de CINCO recetas selladas + guardián que la exige en el binario; firefox construyendo | cierra el hueco de seguridad del §3.bis | 2 |
| 4 | **`atuq`: receta derivada + overlay de chrome** ✅ v0.1 escrita | el andamio de todo lo demás | 3 |
| 4.b | Branding + re-empaque de `omni.ja` ✅ v0.2 | el chrome de verdad | — |
| 4.d | **Abrirlo en pantalla** — destapó EXDEV, el lanzador, el `atk` envenenado y la cadena GTK3 estática | «usable», no sólo «sellado» | — |