/home/tnishinaga/TechMEMOスマートフォン用の表示で見る/home/tnishinaga/TechMEMO日々行ったこと、面白かったことを書き留めます。この広告は、90日以上更新していないブログに表示しています。2018-09-07UEFIの呼び出し規則についてUEFIの呼び出し規則について調べたので忘れないようにメモしておきます。呼び出し規則とバイナリフォーマットUEFIのアプリケーションは以下の点が一般的なLinuxのアプリケーションと異なるため、Linux環境上でUEFIアプリをビルドするには解決の必要があります。Images参照)私のようにx86以外をターゲットとしてビルドする際は後者の解決が重要ですが、今回は前者について調べたことを記します。前者の呼び出し規則とは、関数を呼び出す際のレジスタの使い方などを決めているものです。規則にはどのレジスタに引数を入れて渡すか、どのレジスタに戻り地を入れて返すかなどが決められているため、この規則が異なる関数をそのまま呼び出すことはできません。この規則の違いがx86系のプロセッサ上で動作するUEFIアプリを作る際に問題となります。ABIに定められたものが使われます。conventionと呼ばれるWindowsで使われる呼び出し規則を利用しているため、Linux等からUEFIアプリをビルドするためにはこの呼び出し規約の差異を解決する必要があります。Conventionsを参照。MS-ABIとは書いてはない)私の知っている限りでは、この差異を解決する方法が2つあります。指定することで解決を行います。適応してms-abiで呼び出すようにしています。188行目付近参照https://sourceforge.net/p/gnu-efi/code/ci/3.0.8/tree/inc/x86_64/efibind.hラッパー関数で呼び出し規則を修正する後者はコンパイラがms-abiを利用できない場合に利用される方法です。uefi_call_wrapperというラッパー関数(中身はマクロ)を利用して、引数の数に合わせて引数の順序を入れ替える関数を選んで使用しています。294行目以降参照https://sourceforge.net/p/gnu-efi/code/ci/3.0.8/tree/inc/x86_64/efibind.hLinuxでも同じようなことをやっているようです(efi_call関数を参照)。GitHubなお、ARMやその他アーキテクチャでは基本的にLinuxと同様のABIを用いているので、ABIの変換作業は必要ありません。実際にgnu-efiのラッパー関数も変換を行っていないようです。/inc/aarch64/efibind.h以上です。PEフォーマットの件は次回書きます。v3を買いました月別アーカイブはてなブログをはじめよう!tnishinagaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。