RUST COMPILA EN LA CAJA — paso 1 cerrado, y tres paquetes que estaban en el perfil equivocado

`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/<target>/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) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Tf9T4vGzsMoT7eS8YzMFn
This commit is contained in:
Sergio
2026-09-14 22:07:50 +00:00
co-authored by Claude Opus 5
parent cd78bb98c9
commit 41ab76c8a0
2 changed files with 42 additions and 0 deletions
+13
View File
@@ -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
+29
View File
@@ -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/<target>/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.