Sometimes I want to work on my experimental operating system when I'm away from my Linux monsters. To that end I keep the ability to build it on macOS. Broadly speaking that means a
qemu built to support SDL because the Cocoa one in
brew hasn't worked in years.
But the wrinkle… you can't use the
qemu -kernel xxx flags with 64 bit multiboot kernels. It appears to be a "won't fix" from qemu, so I need to make ISO images, but making a working, modern
grub on macOS cross compiling from ARM is not anything the grub guys envisioned.
Note: You will find people using legacy grub with just an eltorito.bin. This won't work well for 64 bit x86, you have to relink to elf32 then your symbol entries are all in the wrong format and insanity ensues.
So this is how I tackle it:
brewto build the ISO image.
Rip the guts out of an ISO I made on a Linux machine using grub and stuff those into my ISO.
If you mount an ISO you have made, you will find a
boot/grub directory. Take that and stick it into your ISO, add your own
boot/grub/grub.cfg, pack it all up and you are ready to go.
The relevant part of my Makefile looks a bit like this…
iso/boot/grub/grub.cfg : $(srcdir)/scripts/grub.cfg | iso/boot/grub cp $< $@ iso/boot/grub/i386-pc/eltorito.img : $(srcdir)/scripts/grub.tar.gz | iso/boot/grub tar -C iso/boot -xf $< os.iso: iso/boot/kernel.elf iso/boot/grub/grub.cfg iso/boot/grub/i386-pc/eltorito.img mkisofs -R -b boot/grub/i386-pc/eltorito.img -no-emul-boot -boot-load-size 4 -boot-info-table -o $@ iso
You've noticed I grabbed a
grub.tar.gz from someplace you can't see. I've added it as an attachment to this post. I'm using a single file (eltorito.img) as a proxy for the whole thing being unpacked. Don't fiddle with the pieces and expect
make to notice.