はじめに
RustでUEFIを叩くアプリをね1年くらい前にいろいろいじってました。
これ(GitHub:rust-uefi-sample)
昨年の自作OSアドベントカレンダーに書いたやつだね。そうだね。
Rustでベアメタル(UEFI)するときにprintfデバッグできなくて半年たった話
Rustのバージョンが1.24に上がったくらいからビルドができなくなった。
控えめに申し上げてFuck
そうだよ、このアドベントカレンダーの記事書いてから、数か月後にはもうビルドできない体になってたんだよ!ビルドできる喜びを知りやがって!!
まぁそれは置いといて原因が分かったので書いていく。
原因
- こちらのカスタムターゲットファイルの仕様が変更されていた
- lang_itemsの#[lang = "panic_fmt"]が#[panic_implementation]に変更されていた。そのおかげで、結構な変更が入った。
ビルドには、プロジェクトディレクトリ直下で
export RUST_TARGET_PATH=`pwd`
これを打つ必要がある。
何とかビルドできた
が、次はQemuがうまいこと動いてくれなかったので
$ make run
xargo build --target x86_64-unknown-efi
Finished dev [unoptimized + debuginfo] target(s) in 0.08s
cd target/x86_64-unknown-efi/debug && x86_64-efi-pe-ar x *.a
x86_64-efi-pe-ld --gc-sections --oformat pei-x86-64 --subsystem 10 -pie -e efi_main -o build/bootx64.efi target/x86_64-unknown-efi/debug/*.o
cp -fp build/bootx64.efi build/EFI/BOOT/
1440+0 records in
1440+0 records out
1474560 bytes (1.5 MB, 1.4 MiB) copied, 0.017609 s, 83.7 MB/s
qemu-system-x86_64.exe -m 1024 -bios ovmf.fd -usb -usbdevice disk::build/boot.img
D:\ProgramFiles\qemu\qemu-system-x86_64.exe: -usbdevice disk::build/boot.img: '-usbdevice' is deprecated, please use '-device usb-...' instead
D:\ProgramFiles\qemu\qemu-system-x86_64.exe: -usbdevice disk::build/boot.img: could not add USB device 'disk::build/boot.img'
Makefile:56: recipe for target 'run' failed
make: *** [run] Error 1
xargo build --target x86_64-unknown-efi
Finished dev [unoptimized + debuginfo] target(s) in 0.04s
cd target/x86_64-unknown-efi/debug && x86_64-efi-pe-ar x *.a
x86_64-efi-pe-ld --gc-sections --oformat pei-x86-64 --subsystem 10 -pie -e efi_main -o build/bootx64.efi target/x86_64-unknown-efi/debug/*.o
cp -fp build/bootx64.efi build/EFI/BOOT/
qemu-system-x86_64.exe -m 1024 -bios ovmf.fd -hda fat:build/
vvfat build/ chs 1024,16,63
D:\ProgramFiles\qemu\qemu-system-x86_64.exe: -hda fat:build/: Opening non-rw vvfat images without an explicit read-only=on option is deprecated. Future versions will refuse to open the image instead of automatically marking the image read-only.
WARNING: Image format was not specified for 'json:{"fat-type": 0, "dir": "build/", "driver": "vvfat", "floppy": false, "rw": false}' and probing guessed raw.
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
Specify the 'raw' format explicitly to remove the restrictions.
Rustちゃんの仕様変更に追いつくの大変。
特にこういう泥臭いところは結構激しい。
一緒にウォッチしてくれる人おらんかね・・・俺はもう疲れたよ・・・
きょうはここまで。