From 41ab76c8a0c9a42d744b0d1b31b71bd866fa8966 Mon Sep 17 00:00:00 2001 From: Sergio Date: Mon, 14 Sep 2026 22:07:50 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9C=85=20RUST=20COMPILA=20EN=20LA=20CAJA=20?= =?UTF-8?q?=E2=80=94=20paso=201=20cerrado,=20y=20tres=20paquetes=20que=20e?= =?UTF-8?q?staban=20en=20el=20perfil=20equivocado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `rustc 1.97.0` y `cargo 1.97.0` responden en `2.29.29.217`, y un `fn main(){println!("ok");}` compila y **corre**. El toolchain oficial de rust-lang, verificado por su sha256 y sellado tal cual con `foreign = true` (son bytes ajenos, no un build nuestro: clase `ajeno`, fuera del recuento del corpus). Lo que costó hacerlo correr, y ninguna de las dos cosas se ve en el grafo porque las dos estaban `sealed` y en el perfil equivocado: 1. **El cargador musl.** `rustc` es PIE dinámico (`NEEDED librustc_driver-*.so`, `NEEDED libc.so`). En el worker ni arranca —`cannot execute: required file not found`, que es como se ve la falta del intérprete—; en la caja sí, porque ahí está `musl-shared`. 2. **`libgcc_s.so.1`**: `Error loading shared library … _Unwind_Resume: symbol not found`. Lo publica `gcc-libs`, sellado y declarado **sólo en los cuatro perfiles de escritorio**. Una línea en `base`. Es la tercera vez HOY que aparece la misma figura —`tar`, `os-release`, `gcc-libs`—: el paquete existe, está sellado, y no viaja en la imagen que lo necesita. Y una propiedad que vale anotar: **no hace falta un `cc`**. El primer `rustc` falla con `linker \`cc\` not found` y no hay que traer un compilador de C — el toolchain **trae su propio lld** (`rustlib//bin/rust-lld`), y con `-C linker-flavor=ld.lld -C link-self-contained=yes` enlaza y el binario corre. Una distro sin compilador de C puede compilar Rust igual. Va en `perfil.servidor` y no en `base`: son 799 M y una imagen de escritorio no compila nada. Pendiente, que es config del SITIO y no de la receta: que esas flags sean el default (`/etc/cargo/config.toml`), para que `cargo build` funcione sin recordarlas. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_016Tf9T4vGzsMoT7eS8YzMFn --- docs/state/targets.toml | 13 +++++++++++++ recipes/rust-toolchain-bin.toml | 29 +++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/docs/state/targets.toml b/docs/state/targets.toml index 497a2231..8c720b97 100644 --- a/docs/state/targets.toml +++ b/docs/state/targets.toml @@ -24,6 +24,12 @@ descripcion = "userland foundational C: la distro arranca y se usa (shell, VCS, # Lift verbatim de BASE_SYSTEM_PKGS (scripts/product-userland-from-repo.sh). De-Alpinizado y firmado, # tandas base-system-1..3. paquetes = [ + # `gcc-libs` (2026-09-14): `libgcc_s.so.1` y `libstdc++.so.6`. Estaba sellado y declarado sólo en + # los CUATRO perfiles de escritorio — y lo necesita cualquier binario ajeno que no sea estático + # puro. Se vio al traer el toolchain oficial de Rust: `rustc` arrancó (el cargador musl ya está, + # `musl-shared`) y murió con `Error loading shared library libgcc_s.so.1`. La lección de `foot` + # otra vez, y van tres hoy: el paquete existe y no viaja en la imagen que lo necesita. + "gcc-libs", # `os-release` (2026-09-14): la IDENTIDAD del sistema — nombre, URL, color y **el logo oficial**. # No existía: la caja decía «Host: vServer» y ni una palabra de takana. Va en `base` y no en `cli` # porque toda imagen de takana debe saber decir qué es, incluida la más pelada: lo lee cualquier @@ -1331,6 +1337,13 @@ paquetes = [ # sale 78 si el repo no existe. Una caja que se inventa su identidad soberana al arrancar es peor # que una caja sin peer. "minga", + # `rust-toolchain-bin` (2026-09-14): el compilador de Rust. Va en `servidor` y NO en `base` por + # tamaño —799 M— y porque una imagen de escritorio no compila nada; la caja que sirve el repo y + # construye sí. Es el paso 1 de tres: prebuilt ajeno (`foreign`) para desbloquear hoy; luego rustc + # desde fuente con el `llvm18` ya sellado; luego la cadena mrustc del selfhost. Sin compilador de + # Rust, la distro depende del LAB —un rootfs ajeno que ENTRA en el ArtifactHash— para poder + # reconstruir su propio instrumental, que son 12 crates y 42 555 líneas. + "rust-toolchain-bin", # `netup` (2026-09-10): el cliente DHCP propio que levanta la red al arrancar. Entra como RAÍZ # aunque su binario YA venga dentro del `product-rootfs`, y por una razón concreta: el del producto # está congelado en el artefacto sellado del bootstrap, así que un arreglo de netup no llega nunca diff --git a/recipes/rust-toolchain-bin.toml b/recipes/rust-toolchain-bin.toml index 4d01beb8..67773b9e 100644 --- a/recipes/rust-toolchain-bin.toml +++ b/recipes/rust-toolchain-bin.toml @@ -51,3 +51,32 @@ compile = "true" # `--disable-ldconfig`: no hay ldconfig acá y su ausencia haría fallar el instalador por un paso que # en una distro de binarios estáticos no significa nada. install = "./install.sh --prefix=/out/usr --disable-ldconfig --components=rustc,cargo,rust-std-x86_64-unknown-linux-musl" + +# ══ LO QUE COSTÓ HACERLO CORRER, MEDIDO EN LA CAJA ═════════════════════════════════════════════ +# El artefacto sella (799 M) y **no ejecuta** hasta tener dos cosas que la distro publica por +# separado. Ninguna se ve en el grafo: las dos son `sealed` y estaban en el perfil equivocado. +# +# 1. **El cargador musl.** `rustc` es PIE DINÁMICO (`NEEDED librustc_driver-*.so`, `NEEDED libc.so`). +# En el worker ni arranca —`cannot execute: required file not found`, que es como se ve la +# ausencia del intérprete—; en la caja sí, porque ahí está `musl-shared`. +# 2. **`libgcc_s.so.1`.** Con el cargador puesto, el siguiente error fue +# `Error loading shared library libgcc_s.so.1 … _Unwind_Resume: symbol not found`. Lo publica +# `gcc-libs`, que estaba sellado y declarado **sólo en los cuatro perfiles de escritorio**. Una +# línea en `base` y listo. (Tercera vez hoy que aparece la misma figura: el paquete existe y no +# viaja en la imagen que lo necesita.) +# +# Con eso: `rustc 1.97.0` y `cargo 1.97.0` responden en la caja. +# +# ══ Y NO HACE FALTA UN `cc` ════════════════════════════════════════════════════════════════════ +# El primer `rustc hola.rs` falla con `linker \`cc\` not found`: la caja no tiene compilador de C. +# No hace falta traer uno — **el toolchain trae su propio `lld`** +# (`lib/rustlib//bin/rust-lld` y su `gcc-ld/`), y con +# +# -C linker-flavor=ld.lld -C linker=<…>/rust-lld -C link-self-contained=yes +# +# enlaza y el binario CORRE. Probado en la caja: `fn main(){println!("ok");}` → `ok`. Es una +# propiedad que vale anotar: una distro sin compilador de C puede compilar Rust igual. +# +# ⚠ Pendiente (config del SITIO, no de la receta): que esas flags sean el default, con un +# `/etc/cargo/config.toml` o el `CARGO_TARGET_*_LINKER` correspondiente, para que `cargo build` +# funcione sin recordarlas.