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:
@@ -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
|
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.
|
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
|
## 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
|
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 | — |
|
| 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 | 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.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 | **`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.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» | — |
|
| 4.d | **Abrirlo en pantalla** — destapó EXDEV, el lanzador, el `atk` envenenado y la cadena GTK3 estática | «usable», no sólo «sellado» | — |
|
||||||
|
|||||||
Reference in New Issue
Block a user