2001年7月30日 作成

Using PRC-Tools
■戻る■  ■トップ■  ■進む■


A4 レジスタの初期化

以下の議論では、アプリケーションに対しても、共用ライブラリに対しても 「実行形式」という用語を用いる。

関数を呼出す 2 つの方法がある。直接呼出す方法と、アドレスが取られて、 続いてそのポインタを通じて呼出す方法とがある。実行形式は、自分自身への 関数ポインタと、それが使用する GLib での関数へのポインタによって構成さ れる(これは、本当に、関係するスタブへのポインタであるだろう)。しかし、 SysLib や OS API 関数については、ポインタによって構成はされない(なぜなら、 システムトラップへのポインタを構成できないからである)。

簡単なケースでは、グローバルへのアクセスは大きな問題ではない:

  • 実行形式 EE 内の他の関数を呼出す場合、それは、 直接的なサブルーチンコールである。もちろん E のグローバルは 利用可能である。
  • 実行形式 E が GLib L にある関数を呼出す場合、 それは、E にリンクされるスタブの呼出しである。 スタブの仕事は、L のグローバルへのアクセスをセットアップす ること、関数の適切な呼出し、後に E のグローバルをリストアす ることである。再び、適切なグローバルが利用可能となる。
  • 実行形式が SysLib の関数を呼出す場合、システムトラップを通じて呼出すこ とになる。システムトラップは、単にライブラリルーチンを見つけて、それを 呼出すだけである。従ってこの場合、グローバルへのアクセスをアレンジする ためのライブラリルーチンの応答になる。
  • 実行形式が関数へのポインタで構成される場合、自分自身がそのポ インタを通じて呼出し、再度ただの直接的なサブルーチンコールとなる。そし て、グローバルが利用可能となる。

しかしながら、関数へのポインタで構成され、そのポインタが他の誰かへ与え られる場合、その状況はより複雑である。恐らく、引数として渡すか、呼出し 側への返り値として渡すかである。"他の誰か"とは、他の実行形式や OS であ るだろう(ここで、そのポインタは"コールバック関数"と呼ばれる)。

ルールは以下の通りである:

  • アプリケーションによって構成されるいかなるポインタはどこでも作用する。
  • 共用ライブラリによって構成される、ライブラリ内の関数へのポインタは、そ の関数がそのグローバルポインタを初期化するステップを踏んだ場合に作用す る(エントリーポイントに注意)。Feature とトランポリンエントリーポイント がもっとも適切である。
  • 共用ライブラリによって構成される、分離された GLib の関数へのポインタは、 まったく作用しない。なぜなら、GLib スタブに対する特殊なエントリーポイ ントシーケンスを指定することが不可能になってしまうためである。 幸運にも、要求する関数ポインタを返す、 他の GLib への関数を追加することで作用しうる。

prc-tools の前バージョンでは、アプリケーションも A4 レジスタを通じて、 グローバルへアクセスする。従って、その関数ポインタは、共用ライブラリの 関数ポインタと同じ制限を受けていた。適切なステップでグローバルポインタ を初期化することで、共用ライブラリよりもアプリケーションでの使用を容易 にし、CALLBACK_PROLOGUECALLBACK_EPILOGUE のマクロを通じて利用可能であった。これはもはや必要ない。しかしながら、 アプリケーションのビルド時に、もし本当に `-mown-gp' を使 用するなら、CALLBACK_* マクロのより便利な同義として、 APP_ENTRYPOINT を使用できる。


■戻る■  ■トップ■  ■進む■