Linux From Scrach (Parte 3 - Construyendo un sistema temporal 1)
El sistema sólo contendrá las herramientas para iniciar a construir el sistema final LFS y permitir un entorno de trabajo con más comodidad para el usuario que un entorno mínimo mínimo haría.
- El primer paso es construir una nueva cadena de herramientas independiente del host (compilador, ensamblador, enlazador, bibliotecas y algunas herramientas útiles).
- El segundo paso, usa esta cadena de herramientas para construir las otras herramientas esenciales.
Empezamos con lo bueno... ¡leña al mono, que es de goma!
Por si acaso nos hemos despistado...Nos aseguamos que estamos logueados como usuario lfs:
su - lfsCargamos las variables y configuración de usuario
source ~/.bash_profileY por último, comprobamos que estamos en el directorio /mnt/lfs/sources
cd /mnt/lfs/sources
Si nos dá algún error, mejor volvemos a empezar, que estamos a tiempo. Así evitaremos frustrarnos mas adelante.
Binutils-2.30 - 1º Paso (hay otros pasos mas adelante)
El paquete Binutils contiene un enlazador, un ensamblador y otras herramientas para manejar archivos de objetos.
Tiempo aproximado de compilación: 1 SBU
Tamaño de disco requerido: 547 MB
Descomprimimos el archivo
tar -xvf binutils-2.30.tar.gz
cd binutils-2.30
Creamos el directorio build.
mkdir -v buildEntramos dentro del directorio build.
cd buildY ahora configuramos el paquete
../configure --prefix=/tools \Si no nos ha dado ningún error, compilaremos el paquete
--with-sysroot=$LFS \
--with-lib-path=/tools/lib \
--target=$LFS_TGT \
--disable-nls \
--disable-werror
makeSi estamos creando en un sistema x86_64, crearemos un enlace simbólico para garantizar la sanidad de la cadena de herramientas.
case $(uname -m) inY ahora instalamos el paquete
x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac
make installVamos a salir del directorio build
cd ..Borramos el directorio build
rm -R -f build
Y ahora salimos del directorio de binutils-2.30 (y nos quedaremos en /mnt/lfs/sources).
cd ../..GCC-8.1.0 - 1º Paso
El paquete GCC contiene la colección de compiladores, que incluye los compiladores C y C++.
Tiempo aproximado de compilación: 8.8 SBU
Tamaño de disco requerido: 2.2 GB
Tiempo aproximado de compilación: 8.8 SBU
Tamaño de disco requerido: 2.2 GB
Descomprimimos el paquete GCC
y entramos en el directorio gcc -8.1.0tar -xvf gcc-8.1.0.tar.xz
cd gcc-8.1.0GCC ahora requiere los paquetes GMP, MPFR y MPC. Como estos paquetes pueden no estar incluidos en nuestra distribución de Linux, se compilarán con GCC. Desempaquetaremos cada paquete en el directorio de origen del GCC y cambiaremos el nombre de los directorios resultantes para que los procedimientos de compilación de GCC los utilicen automáticamente.
tar -xf ../mpfr-4.0.1.tar.xzEl siguiente comando cambiará la ubicación del enlazador dinámico predeterminado de GCC para usar el que está instalado en / tools. También elimina / usr / include de la ruta de búsqueda de inclusión de GCC:
mv -v mpfr-4.0.1 mpfr
tar -xf ../gmp-6.1.2.tar.xz
mv -v gmp-6.1.2 gmp
tar -xf ../mpc-1.1.0.tar.gz
mv -v mpc-1.1.0 mpc
for file in gcc/config/{linux,i386/linux{,64}}.hFinalmente, en hosts x86_64, estableceremos el nombre de directorio predeterminado para las bibliotecas de 64 bits en "lib":
do
cp -uv $file{,.orig}
sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
-e 's@/usr@/tools@g' $file.orig > $file
echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
touch $file.orig
done
case $(uname -m) inY ahora vamos a crear un directorio build y entraremos dentro de él.
x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
esac
mkdir -v build
cd buildConfiguraremos la compilación:
../configure \Luego compilaremos:
--target=$LFS_TGT \
--prefix=/tools \
--with-glibc-version=2.11 \
--with-sysroot=$LFS \
--with-newlib \
--without-headers \
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--disable-nls \
--disable-shared \
--disable-multilib \
--disable-decimal-float \
--disable-threads \
--disable-libatomic \
--disable-libgomp \
--disable-libmpx \
--disable-libquadmath \
--disable-libssp \
--disable-libvtv \
--disable-libstdcxx \
--enable-languages=c,c++
makeY por último, instalaremos la compilación del paquete.
make installSalimos del directorio hasta quedarmos en /mnt/lfs/sources/gcc-8.1.0/
cd ..Borramos el directorio build
rm -R -f buildY volvemos a salir del directorio hasta quedarnos en /mnt/lfs/sources
cd ..Ya hemos instalado el paquete GCC.
Ahora vamos a instalar los encabezados de API de Linux
Tiempo aproximado de compilación:
0.2 SBU
Tamaño de disco requerido:
917 MB
Descomprimiremos el paquete linux-4.16.7.tar.xz
tar -xvf linux-4.16.7.tar.xzentramos en el directorio linux-4.16.7
cd linux-4.16.7Y ejecutamos la instrucción siguiente:
make mrproperCon la instrucción que acabamos de ejecutar, nos hemos asegurado de que no haya archivos obsoletos incrustados en el paquete.
Ahora extraemos los encabezados del kernel visibles para el usuario desde la fuente.
Se colocan en un directorio local intermedio y se copian en la ubicación necesaria porque el proceso de extracción elimina los archivos existentes en el directorio de destino.
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/includeSalimos del directorio
cd ..Vamos a por el Glibc
El paquete Glibc contiene la biblioteca principal C. Esta biblioteca proporciona las rutinas básicas para asignar memoria, buscar directorios, abrir y cerrar archivos, leer y escribir archivos, manejo de cadenas, coincidencia de patrones, aritmética, etc.
Tiempo aproximado de compilación:
4.3 SBU
Tamaño de disco requerido:
823 MB
Descomprimimos el paquete:
tar -xvf glibc-2.27.tar.xzEntramos en el directorio:
cd glibc-2.27Creamos un directorio build, y entramos dentro de el:
mkdir -v buildLo preparamos para copilarlo:
cd build
../configure \
--prefix=/tools \
--host=$LFS_TGT \
--build=$(../scripts/config.guess) \
--enable-kernel=3.2 \
--with-headers=/tools/include \
libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes
ATENCIÓN:Coompilamos (ojo al detalle de esta vez, que cambiamos la instrucción make, que le añadimos -j1). Así compilaremos con un solo procesador / núcleo.
Se han recibido informes de que este paquete puede fallar al compilarse como una "marca paralela". Así que compilaremos con un solo procesador / núcleo, para evitar problemas.
make -j1Si no ha habido error, instalamos.
make installEn este punto, es imprescindible detenerse y garantizar que las funciones básicas (compilación y enlace) de la nueva cadena de herramientas funcionen como se esperaba. Para llevar a cabo una comprobación de validez, ejecutaremose los siguientes comandos:
echo 'int main(){}' > dummy.cSi todo funciona correctamente, no debería haber errores, y la salida del último comando será semejante a la siguiente forma:
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep ': /tools'
[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]
En la siguiente publicación, seguiremos con Libstdc++, espero que os esté funcionando todo bien, sin errores, y os esté gustando.
Gracias, y hasta la próxima!
Comentarios
Publicar un comentario