■戻る■
■トップ■
■進む■
以下の議論では、アプリケーションに対しても、共用ライブラリに対しても
「実行形式」という用語を用いる。
関数を呼出す 2 つの方法がある。直接呼出す方法と、アドレスが取られて、
続いてそのポインタを通じて呼出す方法とがある。実行形式は、自分自身への
関数ポインタと、それが使用する GLib での関数へのポインタによって構成さ
れる(これは、本当に、関係するスタブへのポインタであるだろう)。しかし、
SysLib や OS API 関数については、ポインタによって構成はされない(なぜなら、
システムトラップへのポインタを構成できないからである)。
簡単なケースでは、グローバルへのアクセスは大きな問題ではない:
-
実行形式 E が E 内の他の関数を呼出す場合、それは、
直接的なサブルーチンコールである。もちろん E のグローバルは
利用可能である。
-
実行形式 E が GLib L にある関数を呼出す場合、
それは、E にリンクされるスタブの呼出しである。
スタブの仕事は、L のグローバルへのアクセスをセットアップす
ること、関数の適切な呼出し、後に E のグローバルをリストアす
ることである。再び、適切なグローバルが利用可能となる。
-
実行形式が SysLib の関数を呼出す場合、システムトラップを通じて呼出すこ
とになる。システムトラップは、単にライブラリルーチンを見つけて、それを
呼出すだけである。従ってこの場合、グローバルへのアクセスをアレンジする
ためのライブラリルーチンの応答になる。
-
実行形式が関数へのポインタで構成される場合、自分自身がそのポ
インタを通じて呼出し、再度ただの直接的なサブルーチンコールとなる。そし
て、グローバルが利用可能となる。
しかしながら、関数へのポインタで構成され、そのポインタが他の誰かへ与え
られる場合、その状況はより複雑である。恐らく、引数として渡すか、呼出し
側への返り値として渡すかである。"他の誰か"とは、他の実行形式や OS であ
るだろう(ここで、そのポインタは"コールバック関数"と呼ばれる)。
ルールは以下の通りである:
-
アプリケーションによって構成されるいかなるポインタはどこでも作用する。
-
共用ライブラリによって構成される、ライブラリ内の関数へのポインタは、そ
の関数がそのグローバルポインタを初期化するステップを踏んだ場合に作用す
る(エントリーポイントに注意)。Feature とトランポリンエントリーポイント
がもっとも適切である。
-
共用ライブラリによって構成される、分離された GLib の関数へのポインタは、
まったく作用しない。なぜなら、GLib スタブに対する特殊なエントリーポイ
ントシーケンスを指定することが不可能になってしまうためである。
幸運にも、要求する関数ポインタを返す、
他の GLib への関数を追加することで作用しうる。
prc-tools の前バージョンでは、アプリケーションも A4 レジスタを通じて、
グローバルへアクセスする。従って、その関数ポインタは、共用ライブラリの
関数ポインタと同じ制限を受けていた。適切なステップでグローバルポインタ
を初期化することで、共用ライブラリよりもアプリケーションでの使用を容易
にし、CALLBACK_PROLOGUE と CALLBACK_EPILOGUE
のマクロを通じて利用可能であった。これはもはや必要ない。しかしながら、
アプリケーションのビルド時に、もし本当に `-mown-gp' を使
用するなら、CALLBACK_* マクロのより便利な同義として、
APP_ENTRYPOINT を使用できる。
■戻る■
■トップ■
■進む■
|