デバッグ情報を捨てるなんてとんでもない
- 初期化遅過ぎるのが若干なんとかなった
- objective_sendネタ
まだシンボル探すのが遅過ぎるんだけど…search_symbols以外にあるかな…
それはともかく、時代はようやくデバッグ情報に追い付いたのである。
僕はC言語の
- 変数に型情報が無い
- スタックフレームにフレーム情報が無い
- スタックフレームの構造が変更できない
という部分に不満があって、なんとかしたいと思ってたところなんだけど(GCや例外処理は、上のがあれば実現できる)、ここで、デバッグ情報さえあれば、上ふたつは解決できるのである。
わーお、素晴らしい。昨日のsnapshotはそこらへんを利用してます。(アドレスしか使ってないけど)
- 変数アドレスからシンボル情報を取得
- シンボル情報から型情報を取得
- やりたい放題!!
とりあえず、なんか、サンプル的に、C言語はオブジェクト指向言語ですあたりにインスパイヤされてみたりして、
struct neko
{
int x;
int y;
int nekomimi;
void (*cry)();
};
struct inu
{
double x;
long long y;
int inumimi;
void (*cry)();
};
struct neko neko_obj;
struct inu inu_obj;
void neko_cry( ) {
puts("nya-");
}
void inu_cry( ) {
puts("bow");
}
int
main (int argc, char **argv)
{
struct snapshot_dump *dump;
snapshot_init( argv[0] );
neko_obj.cry = neko_cry;
inu_obj.cry = inu_cry;
objective_send( &neko_obj, "cry" );
objective_send( &inu_obj, "cry" );
return 0;
}こんな感じ。メッセージをsendできます。
$ a.out Using host libthread_db library "/lib/libthread_db.so.1". nya- bow
わーお。これでイヌネコがワンワンニャーニャーな世界だね。
C言語(?)はなんだってできます。
- C言語(?)の特徴
- 「動的」な言語
- リフレクション
- 高い柔軟性
…とりあえず誰かevalとかやって。
あと、TCCで実行時にプログラムをコンパイルして、関数名からアドレス取得→その先頭をjmpで潰して、実行時関数書きかえとか、うはー夢がひろがりんぐ、ということはなく、どっちかっていうと飽きてきた。
まあいいか。結論としては、デバッグ情報は宝の山ということで。