UEFI Advent Calender 12日目だったoruminです 盛大に遅刻かましてもはや遅刻とさえ言えない感じです。 UEFIのアプリケーション、まずどう作るかわからない方も多いかと思います。 まず、UEFIが実行できる実行形式について、これはWindowsと同じPEバイナリです。 また、EDKのようなツールキットを用いる必要がありますが、 今回はgnu-efiで説明します。 gnu-efiとは、BSDLなEFIアプリケーション開発用ライブラリです。 LinuxやBSDでの開発に親和性が高いと思われます。 これは最近だとaptやpacmanでそのままバイナリインストールが可能です。 そして、次にこのようなファイルを用意します 前者がUEFIでのHello, World!です。efi_mainがエントリポイント、 ImageHandleもSystemTableもUEFIのAPI(Protocol)を呼び出し、使うのに必要なパラメータとなります。 今回は、gnu-efiの初期化をしてから文字列を出力するだけなので特に使用していません。 デバッグ文字列出力は SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Hello, EFI!\n"); でも良いのですが。 後者のMakefileについては、書いてある通りです。 ライブラリとインクルードファイルの指定、 それにリンカスクリプトやスタートアップルーチンはgnu-efiのものを使うように指定。 shared objectな実行ファイルを作ってから、 objcopyコマンドで必要な部分を抜き出す(ELFヘッダは要らないので) という流れになります。 CFLAGSについては、色々ごちゃっと指定してますが、 まず必須なのは-fPICと-fshort-wchar、そしてx86_64であれば-DEFI_FUNCTION_WRAPPERだけで、あとのは特段必ず指定しないといけないものではないです。 さて、これでmakeをしますと、hello.efiが作成されるので、 あとはEFIシステムパーティション直下にでも置いてあげて、起動時にUEFI Sh