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