The other week I was toying with using GNU stow to build an NFS-share, which would allow remote machines to boot from it.
It worked. It worked well. (Standard stuff, PXE booting with an NFS-root.)
Then I started wondering about distributions, since in one sense what I'd built was a minimal distribution.
On that basis yesterday I started hacking something more minimal:
- I compiled a monolithic GNU/Linux kernel.
- I created a minimal initrd image, using busybox.
- I built a static version of the tcc compiler.
- I got the thing booting, via KVM.
Unfortunately here is where I ran out of patience. Using tcc and the static C library I can compile code. But I can't link it.
$ cat > t.c <>EOF
int main ( int argc, char *argv[] )
{
printf("OK\n" );
return 1;
}
EOF
$ /opt/tcc/bin/tcc t.c
tcc: error: file 'crt1.o' not found
tcc: error: file 'crti.o' not found
..
Attempting to fix this up resulted in nothing much better:
$ /opt/tcc/bin/tcc t.c -I/opt/musl/include -L/opt/musl/lib/
And because I don't have a full system I cannot compile t.c to t.o and use ld to link (because I have no ld.)
I had a brief flirt with the portable c-compiler, pcc, but didn't get any further with that.
I suspect the real solution here is to install gcc onto my host system, with something like --prefix=/opt/gcc, and then rsync that into my (suddenly huge) intramfs image. Then I have all the toys.
Tags: initramfs, kvm, musl, tcc 2 comments
You obviously by saying `I compiled a monolithic GNU/Linux kernel` you meant Linux kernel - political over-correctness ;^)