uchan-nos/mikanos

day03_b での FreePool におけるimplicit declaration error

Closed this issue · 3 comments

実行環境

  • Ubuntu 20.04

生じた問題

day03_b の写経をしていたところ、ビルドしたときに

/home/yudai/edk2/MikanLoaderPkg/Main.c:150:3: error: implicit declaration of function 'FreePool' is i
nvalid in C99 [-Werror,-Wimplicit-function-declaration]                                              
  FreePool(gop_handles);                                                                             
  ^                                                                                                  
1 error generated.    

というエラーが生じてビルドできませんでした。これはosbook_day03_b タグの Main.c 内の

FreePool(gop_handles);

で生じていました。

解決方法

とりあえず、私の環境では該当部分を

gBS->FreePool(gop_handles);

に変更したことでビルドは通り、QEMU で実行したときの挙動も書籍のようになったのですが、この対処法は正しいでしょうか?

はい、正しいです。

本来 gBS->FreePool と書くべきところですが、おそらく単なるミスで gBS-> を付け忘れていますね。
私の環境でビルドできていたのは、EDK IIに FreePool という関数が含まれている からです。
知らず知らずのうちにこの関数を参照していたため、ミスに気付きませんでした。
この関数は gBS->FreePool を呼びだすだけの単純な実装になっていて、実用上はどちらを使っても問題にならないようです。

ちなみに gBS->FreePool を使うべきという根拠は、UEFI 仕様書の EFI_BOOT_SERVICES.LocateHandleBuffer() の仕様に

It is the caller's responsibility to call the Boot Service EFI_BOOT_SERVICES.FreePool() when the caller no longer requires the contents of Buffer.

とあるからです。(まあ、EDK II の FreePool も最終的には gBS->FreePool を呼ぶのだから仕様は満たしている、という見方もできますけども)

もし、修正をプルリクしていただけたら取り込みますが、どうしましょうか?

ご回答くださりありがとうございます。プルリクを作りましたのでよろしくお願いします。

プルリクを確認したので、こちらは閉じます