Appendix A: Troubleshooting

In this appendix, we will cover common errors and their solutions for various chapters of the book.

Chapter 3

Here are various solutions to issues you may run into in Chapter 3:

The ld tool does not work

When running the linker tool ld, it may freeze and not produce output. Check the linker file for a syntax error. Make sure comments are closed. You can also run the command with --verbose for more output during linking to help in debugging.

Linux:

ld --verbose --nmagic --output kernel.bin --script linker.ld multiboot_header.o boot.o

Mac OS X:

~/opt/bin/x86_64-pc-elf-ld --verbose --nmagic --output kernel.bin --script linker.ld multiboot_header.o boot.o

Error: no multiboot header found

When booting up your kernel, QEMU may print out a message like this:

error: no multiboot header found
error: you need to load the kernel first

This can happen for a number of reasons, but is often caused by typo-ing something. Double check your code against the examples and make sure that they’re identical, especially things like magic numbers. They’re easy to mis-type.

Could not read from CDROM (code 0009)

On a system that uses EFI to boot, you may see an error like this:

$ qemu-system-x86_64 -cdrom os.iso
Could not read from CDROM (code 0009)

The solution may be to install the grub-pc-bin package:

$ sudo apt-get install grub-pc-bin

After the install is complete, you will need to recreate the ISO file before trying QEMU again:

$ grub-mkrescue -o os.iso isofiles
$ qemu-system-x86_64 -cdrom os.iso

xorriso : FAILURE : Cannot find path ‘/efi.img’ in loaded ISO image

When building the ISO, you may see a message like this:

xorriso : FAILURE : Cannot find path ‘/efi.img’ in loaded ISO image

The solution may be to install the mtools package:

$ sudo apt-get install mtools

Could not initialize SDL(No available video device) - exiting

When booting your kernel in QEMU, you may see an error like this:

Could not initialize SDL(No available video device) - exiting

You can pass an extra flag to QEMU to not use SDL, -curses:

$ qemu-system-x86_64 -curses -cdrom os.iso

Or, try installing SDL and its development headers:

$ sudo apt-get install libsdl2-dev