gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 604Rust 56Shell 36Markdown 281227 Sutichaykuna

hammer-build: -C link-self-contained=no en el build rust nativo (zig provee crt1.o)

El link de las recetas Cargo nativas lo hace `zig cc` (un driver de compilador completo
que ya aporta sus startfiles crt1.o). El target musl vanilla `x86_64-unknown-linux-musl`
trae CRT AUTOCONTENIDO (self-contained/rcrt1.o) y lo pasaría también al linker ⇒
`ld.lld: duplicate symbol: _start` (rcrt1.o vs crt1.o de zig). Añadir
`-C link-self-contained=no` a RUSTFLAGS hace que rustc NO aporte startfiles propios y
deje que zig los provea — para TODAS las unidades (deps, build-scripts, proc-macros y la
crate top; RUSTFLAGS las alcanza a todas, los bin_flags de `cargo rustc --` sólo a la top).

No-op para el rust de Alpine (host x86_64-alpine-linux-musl): su self-contained ya está
APAGADO — de hecho el baseline 9adefb82 linkea sin chocar con zig, lo que sólo es posible
si Alpine NO aporta startfiles self-contained. Imprescindible para un rust vanilla, p. ej.
el hammer-rust del frente self-host (SWAP_RUST): con él, hammerd YA compila y sella con
hammer-rust (antes fallaba en el build-script de proc-macro2).

Verificación baseline (of_tree(stage1) sin swap == 9adefb82 con este hammer) en cola.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

503e09aeede90be2e299d397b324705071b2816a · ruwaq sergio · (4 killa ñawpaq) · tayta f06bfc7ee · kay commitpi sach'ata qhaway

Semántico sayk'uy · 1

crates/hammer-build/src/lib.rs

1 qillqakuna · +10 −1

diff --git a/crates/hammer-build/src/lib.rs b/crates/hammer-build/src/lib.rs
index 4602d412..fb17632a 100644
--- a/crates/hammer-build/src/lib.rs
+++ b/crates/hammer-build/src/lib.rs
@@ -345,12 +345,21 @@ fn resolve_phases(recipe: &Recipe, src: &Path) -> hammer_core::Result<Phases> {
                         // Dinámico: apaga crt-static para poder dlopen (necesita el loader/musl en el rootfs).
                         LinkMode::Dynamic => "-C target-feature=-crt-static",
                     };
+                    // `-C link-self-contained=no`: el link (de TODO — deps, build-scripts,
+                    // proc-macros y la crate top) lo hace `zig cc`, que ya aporta sus startfiles
+                    // (crt1.o). El target musl `x86_64-unknown-linux-musl` por defecto trae CRT
+                    // AUTOCONTENIDO (self-contained/rcrt1.o) y lo pasaría también ⇒ `ld.lld:
+                    // duplicate symbol: _start`. El rust de Alpine (host `x86_64-alpine-linux-musl`)
+                    // ya tiene el self-contained APAGADO (de ahí que el baseline 9adefb82 linkee
+                    // sin chocar), así que este flag es no-op para él e imprescindible para un rust
+                    // vanilla (p. ej. el hammer-rust del frente self-host). RUSTFLAGS alcanza a
+                    // todas las unidades; los `bin_flags` (cargo rustc --) sólo a la top.
                     Some(format!(
                         "printf '%s\\n' '#!/bin/sh' 'for a do' \
                          'case \"$a\" in --target=*) a=--target=x86_64-linux-musl ;; esac' \
                          'set -- \"$@\" \"$a\"' 'shift' 'done' 'exec zig cc -mcpu=baseline \"$@\"' \
                          > \"$PWD/.hammer-zig-cc\" && chmod +x \"$PWD/.hammer-zig-cc\" && \
-                         CC=\"$PWD/.hammer-zig-cc\" RUSTFLAGS=\"-C linker=$PWD/.hammer-zig-cc\" \
+                         CC=\"$PWD/.hammer-zig-cc\" RUSTFLAGS=\"-C linker=$PWD/.hammer-zig-cc -C link-self-contained=no\" \
                          cargo rustc --release --locked --offline{flags_suffix} -- {bin_flags}"
                     ))
                 } else {