TL;DR;
UbuntuにはOVMFがない(?)ので別途いれておかないといけない
ことの始まり
ohgamiさんが書かれているフルスクラッチ本を読みたいと思い、
適当にUbuntuのVM立てて書いてあるとおり環境を作ってみたもののうまく動かなかったので、
調べた結果OVMFがなかったり、微妙に本来の手順とずれていたのできちんとまとめたくなった。
ovmfをダウンロード
UbuntuにはどうもOVMFというファームウェアのVMが入ってないっぽいのでバイナリからダウンロードする
wget https://sourceforge.net/projects/edk2/files/OVMF/OVMF-X64-r15214.zip
unzip OVMF-X64-r15214.zip
OVMF.fdを移動
解凍したzip内にOVMF.fdがあるので、これを/usr/share/ovmfに配置
mv OVMF.fd /usr/share/ovmd
これでOVMF側の設定は完了
efiファイルを所定の位置に配置
次に、作成したコードファイルをefiに変換し、fs/EFI/BOOT/に配置。その際、ファイル名をBOOTX64.EFIに変換
x86_64-w64-mingw32-gcc -Wall -Wextra -e efi_main -nostdinc -nostdlib \
-fno-builtin -Wl,--subsystem,10 -o main.efi main.c
mkdir -p fs/EFI/BOOT
cp main.cfi fs/EFI/BOOT
mv fs/EFI/BOOT/main.cfi fs/EFI/BOOT/BOOTX64.CFI
//結果はこんな感じ
tree -a
.
├── fs
│ └── EFI
│ └── BOOT
│ └── BOOTX64.EFI
├── main.c
└── main.efi
QEMUを実行
fs配下をフォーマットしてUEFIをUbuntu上で表示させます。
qemu-system-x86_64 -bios /usr/share/ovmf/OVMF.fd -hda fat:fs

問題なく表示されました。