PSPであそぼう(6)

しかし、理由は知らないが、PSPのtoolchainのldのディフォルトのリンカスクリプトには、この__CTOR_LIST__と__DTOR_LIST__が記述されていない。


でもここまで理解していれば心配はいらない。「ld -verbose」として、リンカスクリプトを吐き出させ、.ctorを以下のように書き換える。(.dtorのほうも同様の変更を行なう必要がある)


.ctors :
{
__CTOR_LIST__ = .;
LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
*(.ctors)
LONG(0)
KEEP (*crtbegin*.o(.ctors))
KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
__CTOR_END__ = .;
}

リスト中に何度も出てくる「.」は現在のアドレスを意味している。上のリストは次のような意味だ。


__CTOR_LIST__ = 現在のアドレス
バイナリにLONG型で(( __CTOR_END__ - __CTOR_LIST ) / 4 - 2)という値を
 埋め込みなさい。
.ctorセクション(コンストラクタリスト)をここに埋め込みなさい
バイナリにLONG型で0を埋め込みなさい。
各オブジェクトファイルにある.ctorセクションを束ねなさい。
__CTOR_END__ = 現在のアドレス

途中でLONG型で値を二個埋め込んでいるので、__CTOR_END__から__CTOR_LIST__を引いて4(ポインタサイズ)で割った数からこの二個を引いた数だけ関数ポインタが登録されていることになる。最初にバイナリに埋め込んでいる数値はそういう意味である。


.dtorのほうも同様に修正して、このリンカスクリプトをldに-Tオプションでリンクするときに指定してやれば__CTOR_LIST__と__DTOR_LIST__というシンボルがC言語のソース(あるいはスタートアップのためのアセンブラのソース)から参照できるようになる。


念のためリンカスクリプトと修正したソースとビルド用のバッチファイルとスタートアップルーチンをアップしておく。

http://yaneu.com/yaneurao/hatena/cpp_realization_psp050624.zip


前回のプロジェクト(id:yaneurao:20050623)に上書きして使っていただきたい。


Enjoy PSP programing in C++!!