✅ 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:
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user