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