Recompilar GCC ahora con soporte completo: C, C++, LTO, shared libraries, y threads POSIX. Este GCC compila contra el sysroot musl y produce binarios musl nativos para el target, aunque el propio GCC siga siendo glibc-linked (host == build machine). Es temporal: stage 3 rebuild nativo dentro del chroot.
- musl 1.2.6 en
$LFS/tools(capítulo anterior) - Binutils 2.46.1 en
$LFS/tools - GCC pass 1 en
$LFS/tools(sigue siendo el compilador activo)
GCC con --target=x86_64-linux-musl --with-sysroot=$LFS/tools busca los
headers del sistema en $LFS/tools/x86_64-linux-musl/include/. musl instaló
los suyos en $LFS/tools/include/. Hay que copiarlos:
cp -r $LFS/tools/include/* $LFS/tools/x86_64-linux-musl/include/cd $LFS/build
rm -rf gcc-16.1.0 # empezar limpio
tar -xf $LFS/sources/gcc-16.1.0.tar.xz
cd gcc-16.1.0
# GMP, MPFR, MPC dentro del árbol (igual que pass 1)
tar -xf ../gmp-6.3.0.tar.xz && mv gmp-*/ gmp
tar -xf ../mpfr-4.2.1.tar.xz && mv mpfr-*/ mpfr
tar -xf ../mpc-1.3.1.tar.gz && mv mpc-*/ mpc
mkdir build && cd build
../configure \
--prefix=$LFS/tools \
--build=$(../config.guess) \
--host=x86_64-pc-linux-gnu \
--target=x86_64-linux-musl \
--with-sysroot=$LFS/tools \
--disable-nls \
--enable-languages=c,c++ \
--enable-shared \
--enable-threads=posix \
--enable-lto \
--enable-__cxa_atexit \
--disable-libsanitizer \
--disable-libvtv \
--disable-multilib \
--disable-bootstrap
make -j$(nproc) 2>&1 | tee build.log
make installNota: usamos
--host=x86_64-pc-linux-gnu(glibc del build host) porque--host=x86_64-linux-muslrequiere que configure ejecute test programs musl-linked en el host glibc, lo cual no es posible. El GCC resultante es glibc-linked pero produce binarios musl vía--with-sysroot.--disable-bootstrapevita que GCC se compile 3 veces (solo necesitamos 1 pase para stage 1).
| Flag | Significado |
|---|---|
--enable-languages=c,c++ |
C y C++ completos |
--enable-shared |
GCC genera y enlaza librerías compartidas |
--enable-threads=posix |
Soporte de hilos POSIX (usando musl) |
--enable-lto |
Link Time Optimization |
--enable-__cxa_atexit |
Manejo correcto de destructores C++ |
--disable-libsanitizer |
Sanitizers no disponibles en musl |
--disable-libvtv |
Vtable verification (no soportado en musl) |
--disable-bootstrap |
Un solo pase de compilación (stage 1) |
--host=x86_64-pc-linux-gnu |
El GCC corre en el host glibc (por ahora) |
Antes de compilar, asegurarse de que el linker dinámico musl exista en el sysroot (lo necesita el build system de GCC para linkear los binarios):
ln -sf libc.so $LFS/tools/lib/ld-musl-x86_64.so.1rm -rf $LFS/sources/gcc-16.1.0/buildecho 'int main(){ return 0; }' > /tmp/test.c
$LFS/tools/bin/x86_64-linux-musl-gcc -o /tmp/test /tmp/test.c
file /tmp/test
# → ELF ... interpreter /lib/ld-musl-x86_64.so.1, muslEl GCC y binutils en $LFS/tools/bin/ son glibc-linked (temporales):
readelf -l /tools/bin/x86_64-linux-musl-gcc | grep interpreter
# → /lib64/ld-linux-x86-64.so.2 (glibc — esperado)Pero los binarios que produce son musl nativos:
$LFS/tools/bin/x86_64-linux-musl-gcc hello.c -o hello
file hello
# → ... interpreter /lib/ld-musl-x86_64.so.1, muslAntes del chroot, crear los archivos mínimos que necesita el sistema.
cat > $LFS/etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/usr/bin/false
daemon:x:6:6:Daemon User:/dev/null:/usr/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/run/dbus:/usr/bin/false
nobody:x:65534:65534:Unprivileged User:/dev/null:/usr/bin/false
EOFcat > $LFS/etc/group << "EOF"
root:x:0:
bin:x:1:daemon
sys:x:2:
kmem:x:3:
tty:x:5:
daemon:x:6:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
cdrom:x:15:
adm:x:16:
messagebus:x:18:
input:x:24:
kvm:x:61:
mail:x:34:
wheel:x:97:
users:x:999:
nogroup:x:65534:
EOFcat > $LFS/etc/shadow << "EOF"
root::::::::
EOF
cat > $LFS/etc/shells << "EOF"
/bin/bash
/bin/sh
EOFNota: el campo de password vacío en shadow permite login sin contraseña. Se cambia después con
passwddentro del chroot.
cat > $LFS/etc/fstab << "EOF"
# Sistema de archivos virtuales
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /run tmpfs defaults 0 0
EOFcat > $LFS/etc/resolv.conf << "EOF"
nameserver 1.1.1.1
nameserver 8.8.8.8
EOFcat > $LFS/etc/hosts << "EOF"
127.0.0.1 localhost
::1 localhost
EOFcat > $LFS/etc/profile << "EOF"
export PATH=/tools/bin:/usr/bin:/bin
export LC_ALL=POSIX
if [ "$EUID" = 0 ]; then
export PS1='\u [ \w ]# '
else
export PS1='\u [ \w ]\$ '
fi
alias ls='ls --color=auto'
EOF| Componente | Linkado contra | Nota |
|---|---|---|
x86_64-linux-musl-gcc |
glibc (host) | Temporal; produce binarios musl |
x86_64-linux-musl-as, ld, ar |
glibc (host) | Temporal |
/tools/lib/libc.so |
musl | Primer shared library musl del sistema |
Sin chroot: usar x86_64-linux-musl-gcc como cross-compiler desde el host
glibc para compilar binutils, musl, GCC, busybox, bash directamente en
$LFS/usr. Luego chroot limpio con sistema musl nativo.
Opcional pero recomendado. Este backup permite volver a este punto sin tener que recompilar todo desde cero.
# Desde el host (afuera del chroot)
cd $LFS
tar -cJpf $LFS/sources/tools-stage1-$(date +%Y%m%d).tar.xz tools/Para restaurar:
cd $LFS
rm -rf tools
tar -xpf $LFS/sources/tools-stage1-*.tar.xzTamaño estimado: ~500-600 MB comprimido (incluye binutils + GCC completos).