Coins Java - JCR list

Java Class Reference List

[Coins Java - 解析] [Coins Java - データ構造]

クラスのシンボル参照について

java.lang.Class#forNameというメソッドを使用すると、引数に取ったクラス名からクラスの実体を取得できる。しかし、実行時には実行ファイルのシンボルの情報を使用できないため、一度も見たことのないクラスは通常の方法ではロードすることができない。

そこで、gcjでは _ _JCR_LIST_ _[] と言う名前の、ユーザクラスを寄せ集めたリストを作成しておき、実行時に先立ってシンボルを元にクラスの実体を取得できるようなテーブルが作成される。

しかし、gcjを使用すると、一つ一つのクラスを別々のオブジェクトファイルにコンパイルすることができ、「ユーザクラスをすべて寄せ集めたリスト」というものの作成が比較的難しい。そこで、セクションの機能を使って、ユーザに負担を負わせることなくこのリストを作成している。

セクションに関する予備知識

Unixの世界では、.text, .data, .bss という名前の付けられたセクションがよく使用される。

section 意味
.text 書き換え不可能な領域、関数などに使用される
.data 初期化されるデータ領域、初期化される変数などに使用される
.bss 初期化されないデータ領域、初期化されない変数などに使用される

これらのデータは、リンク時にセクションごとに寄せ集められる。

gcjでは、 .jcr という名前のセクションを用意し、各クラスはこのセクションに自クラスへの参照を配置する。

これらはリンク時に上図のように一つのセクションにまとめられる。しかしこれだけではセクションの開始位置や終端位置を把握できない。

crtbeginとcrtend

gcjではcrtbeginとcrtendに以下の細工を施すことによって、.jcrセクションの開始位置と終端位置を容易に検出できるようにしている。

これらをコンパイルすると以下の図のようになる。

_ _JCR_LIST_ _という名前の配列にアクセスすることによって、クラスファイルの一覧を取得できるようになった。また、この配列の終端はnullポインタが格納されているため、容易に検出できる。

main関数の実行に先立って、このリストに格納されているクラスをシンボルによって参照できるように別のテーブルに格納することになる。

参考文献

Copyright (C) 2002-2006 s.arakawa