2025-3-1 Linux From Nothing Compiler Madness

Linux From Nothing all in here (;

3. Compiler

Convert our disk to qcow2

cd LFN

sudo losetup -fP --show disk.img
sudo mount /dev/loop#p1 /mnt

sudo mkdir /mnt2
sudo modprobe nbd max_part=8
qemu-img create -f qcow2 disk2.img 100G
sudo qemu-nbd -c /dev/nbd0 disk2.img

sudo fdisk /dev/nbd0
n - p - 1 (leave default 2048sectors)
a
w

sudo mkfs.ext4 /dev/nbd0p1

sudo mount /dev/nbd0p1 /mnt2
sudo cp -R /mnt/* /mnt2/
sudo grub-install --target=i386-pc --root-directory=/mnt2 --no-floppy --modules="normal part_msdos ext2 multiboot" /dev/nbd0

sudo umount /mnt
sudo umount /mnt2

sudo mount /dev/nbd0p1 /mnt

Linux Headers

The linux headers are used by alot of basic program to get access to kernel functions.

cd linux

make headers

sudo cp -r usr/include/* /mnt/usr/include/

cd ..

Glibc (Lib)

[The GNU C Library - GNU Project - Free Software Foundation](https://www.gnu.org/software/libc/

We downloaded it from git and thats kinda suicide, so lets get a real version (;

rm -r glibc-build

wget https://ftp.gnu.org/gnu/glibc/glibc-2.41.tar.gz

tar -xvzf glibc-2.41.tar.gz

mkdir glibc-build

cd glibc-build
../glibc-2.41/configure --with-headers=/mnt/usr/include --without-selinux --libdir=/lib --prefix=/usr

make -j8
sudo make DESTDIR="/mnt" install
cd ..

GCC & libstdc++

The basic Gnu C Compiler and its c++ libs.

https://gcc.gnu.org/

wget https://ftp.gnu.org/gnu/gcc/gcc-14.2.0/gcc-14.2.0.tar.gz

tar -xvzf gcc-14.2.0.tar.gz

cd gcc-14.2.0
./contrib/download_prerequisites
cd ..

mkdir gcc-build
cd gcc-build
../gcc-14.2.0/configure --with-glibc-version=2.41 --disable-multilib --enable-languages=c,c++ --disable-bootstrap --prefix=/usr

make -j8

sudo make DESTDIR="/mnt" install
cd ..

Make

Make, we all know what it is by now.

wget https://ftp.gnu.org/gnu/make/make-4.4.tar.gz

tar -xvzf make-4.4.tar.gz

mkdir make-build
cd make-build
../make-4.4/configure --prefix=/usr

make -j8
sudo make DESTDIR="/mnt" install

cd ..

Tar

https://www.gnu.org/software/tar/

We will need alot!

wget https://ftp.gnu.org/gnu/tar/tar-1.35.tar.gz

tar -xvzf tar-1.35.tar.gz

mkdir tar-build
cd tar-build
../tar-1.35/configure --without-selinux --prefix=/usr

make -j8
sudo make DESTDIR="/mnt" install

cd ..

Gzip

https://www.gnu.org/software/gzip/

We will need with Tar.

wget https://ftp.gnu.org/gnu/gzip/gzip-1.13.tar.gz

tar -xvzf gzip-1.13.tar.gz

mkdir gzip-build
cd gzip-build
../gzip-1.13/configure --prefix=/usr

make -j8
sudo make DESTDIR="/mnt" install

cd ..

Sed

https://www.gnu.org/software/sed/

Used with Make.

wget https://ftp.gnu.org/gnu/sed/sed-4.9.tar.gz

tar -xvzf sed-4.9.tar.gz

mkdir sed-build
cd sed-build
../sed-4.9/configure --without-selinux --prefix=/usr

make -j8
sudo make DESTDIR="/mnt" install

cd ..

Grep

https://www.gnu.org/software/grep/

Used with Make.

wget https://ftp.gnu.org/gnu/grep/grep-3.11.tar.gz

tar -xvzf grep-3.11.tar.gz

mkdir grep-build
cd grep-build
../grep-3.11/configure --prefix=/usr

make -j8
sudo make DESTDIR="/mnt" install

cd ..

Awk

https://www.gnu.org/software/gawk/

Needed by perl

wget https://ftp.gnu.org/gnu/gawk/gawk-5.3.1.tar.gz

tar -xvzf gawk-5.3.1.tar.gz

mkdir gawk-build
cd gawk-build

../gawk-5.3.1/configure --prefix=/usr

make -j8

sudo make DESTDIR="/mnt" install

cd ..

Binutils

https://www.gnu.org/software/binutils/

Used with Make.

wget https://sourceware.org/pub/binutils/releases/binutils-2.44.tar.gz

tar -xvzf binutils-2.44.tar.gz

mkdir binutils-build
cd binutils-build
../binutils-2.44/configure --prefix=/usr

make -j8
sudo make DESTDIR="/mnt" install

cd ..

Make internet work

Lets download that missing Cert for https.

wget https://curl.se/ca/cacert.pem

sudo mkdir /mnt/etc/ssl/
sudo mkdir /mnt/etc/ssl/certs/
sudo mv cacert.pem /mnt/etc/ssl/certs/ca-certificates.crt

sudo nano /mnt/sbin/init

Should look like

#!/bin/bash

mount -t proc none /proc
mount -t sysfs none /sys

ip link set up eth0
ip addr add 10.0.2.15/24 dev eth0
ip route add 10.0.2.2 dev eth0
ip route add 0/0 via 10.0.2.2 dev eth0

dnsmasq -uroot

export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt

export COMPILER_PATH=/usr/libexec/gcc/x86_64-pc-linux-gnu/14.2.0:/usr/bin
export LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.0
export CPATH=/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.0/include

exec /bin/bash

and lets umount and start LFN

sudo mkdir /mnt/tmp

sync
sudo umount /mnt
sudo qemu-nbd -d /dev/nbd0
qemu-system-x86_64 disk2.img -smp 8 -m 8G

XZ Utils

https://github.com/tukaani-project/xz

Lets test our LFN with XZ

#On LFN
cd root

wget https://github.com/tukaani-project/xz/releases/download/v5.6.4/xz-5.6.4.tar.gz

tar -xvf xz-5.6.4.tar.gz

mkdir xz-build
cd xz-build
../xz-5.6.4/configure --prefix=/usr

make -j8
make install

sync
sync
sync

Here is the image: https://d2xw7bkejy3jlh.cloudfront.net/disk3.img.xz