お疲れ様です!いつもお世話になっております。!!
なんと4回目になりました!今回もどうぞよろしくお願いいたします!!!
【前回から】
前回の「その3」では EDK2(UDK2017)環境を構築しました。
今回は "みかん本" の「2.2章 EDK IIでハローワールド(osbook_day02a)」で
記載のある、「MikanLoader」を Windows環境でビルドしたいと思います。
Linux環境とのビルド環境の違いからか、ワーニングやエラーの
出方が変わるようで、 "みかん本" のオリジナルのソースのままでは
ビルドが成功しませんでした。
このあたりも後ほど説明したいと思います。
なお、"みかん本" の "付録B MikanOSの入手"もよく読んでおいて
ください。
【今回の目標】
・"みかん本" の「2.2章 EDK IIでハローワールド(osbook_day02a)」を
Windows環境でビルドする。
【結果】
MikanLoaderパッケージの変更は必要でしたが、
!ビルドできました!
【必要なもの】
・「その3」で記載した「【必要なもの】」一式
・MikanOSのリポジトリにあるソースファイル
【手順】
-
1. MikanOSのリポジトリにある osbook_day02a タグのソース
コードを入手する
1) コマンドプロンプトを開く
2) カレントディレクトリを C:\WinMikanOS に移動する
- cd C:\WinMikanOS
3) Gitで MikanOS のソースファイルを clone する
- git clone https://github.com/uchan-nos/mikanos.git
4) カレントディレクトリを C:\WinMikanOS\mikanos に移動する
- cd C:\WinMikanOS\mikanos
5) Gitで MikanOS の osbook_day02a タグのソースファイルを
checkoutする
- git checkout osbook_day02a
6) コマンドプロンプトを閉じる
- exit
2. EDK2(UDK2017)に MikanLoaderパッケージ のソースファイルを
適用する
ウィンドウズ標準のシンボリックリンク機能を使います。
1) 管理者権限のあるコマンドプロンプトを開く
2) 管理者権限のあるコマンドプロンプトで以下を入力する
- mklink /d C:\MyWorkspace\MikanLoaderPkg C:\WinMikanOS\mikanos\MikanLoaderPkg
3) 管理者権限のあるコマンドプロンプトを閉じる
- exit
3. EDK2(UDK2017)にある target.txt を MikanLoaderパッケージ
用に修正する
1) お好みのテキストエディタで C:\MyWorkspace\Conf\target.txt
を開く
2) 以下の1か所を変更する。
ACTIVE_PLATFORM = Nt32Pkg/Nt32Pkg.dsc
-> ACTIVE_PLATFORM = MikanLoaderPkg/MikanLoaderPkg.dsc
3) C:\MyWorkspace\Conf\target.txt を保存して、テキスト
エディタを終了する
4. このままビルドするとリンクエラーが発生するため(後述)、
MikanLoaderパッケージを変更する
・C:\MyWorkspace\MikanLoaderPkg\MikanLoaderPkg.dsc (1か所)
ファイルの末尾に以下の2行を追加する
- [BuildOptions]
- MSFT:*_*_*_CC_FLAGS = /wd4702
5. MikanLoaderパッケージをビルドする
1) スタートメニュー の Visual Studio 2015 にある、
「VS2015 x86 Native Tools コマンド プロンプト」を開く
2) カレントディレクトリを C:\MyWorkspace に移動する
- cd C:\MyWorkspace
3) 以下の通り edksetup.bat を実行してビルド環境を準備する
- edksetup --nt32 X64
4) 以下の通り build clean を実行する
- build clean
5) 以下の通り build を実行して Loader.efi をビルドする
- build
6. MikanLoaderパッケージ がビルドされたか確認する
1) Loader.efi がビルドされたか確認する
- dir C:\MyWorkspace\Build\MikanLoaderX64\DEBUG_VS2015x86\X64\Loader.efi
【紆余曲折】
・MikanLoaderパッケージのオリジナルのソースのままでビルドをすると
リンクの際にエラーとなります。
エラーの内容は以下の通りです。
(1) c:\myworkspace\mdepkg\library\uefiapplicationentrypoint\applicationentrypoint.c(75)
error C2220: 警告をエラーとして扱いました。'executable' ファイルは生成されません。
(2) c:\myworkspace\mdepkg\library\uefiapplicationentrypoint\applicationentrypoint.c(75)
warning C4702: 制御が渡らないコードです。
MikanLoaderのMain.cにあるUefiMain()関数にあるwhile (1);による
無限ループがあるため、コール元の applicationentrypoint.cにある
_ModuleEntryPoint()関数に戻れないことのワーニング(2)を
エラーとして扱う(1)ために起きたもので、ビルド環境(設定)の違い
により出るものと思います。
EDK2(UDK2017)共通のソースファイルやビルド設定は触りたく
なかったので、MikanLoaderパッケージ側を変更することで
対処しました。
※手順ではコンパイラーの設定変更でリンカー警告となるC4702の
ワーニングを抑制しています。
【次回の目標】
・"みかん本" の「2.5章 メモリマップの取得(osbook_day02b)」を
Windows環境でビルドする。
にしようと思います。
【参考とか引用とか】
・パッケージ単位でコンパイラーやリンカーのオプションを
追加したり、まるごと変更したりする方法
「3.7 Building the module」
https://edk2-docs.gitbook.io/edk-ii-module-writer-s-guide/3_module_development/37_building_the_module
・コンパイラーの警告を非表示にする方法
https://docs.microsoft.com/ja-jp/cpp/build/reference/compiler-option-warning-level?view=msvc-140
・リンカー警告をエラーとして扱うことについて
https://docs.microsoft.com/ja-jp/cpp/build/reference/wx-treat-linker-warnings-as-errors?view=msvc-140