LZHUFがいまいち分からなくて挫折したとも言う・・・orz
BFD、big fucking dealがBinary File Descriptorになったライブラリ。GCCに付属してくるもの。
何ができるかといえば、オブジェクトファイルとか、アーカイブファイルからいろんな情報が取ってこれる。
っで、これを使ってC++らしくないものを作ってみようと考えたのだが、上手くいかない。
ちなみに、らしくないものとは、リフレクションのことである。
BFDつかってシンボルを読み込んで、関数のアドレスは取れた。名前マングリングされた関数名で取れるので、デマングルするか、呼び出しの際にマングルする必要があるが・・・
(あぁ、取得したときにデマングルすればマングラーなど要らんのか、無駄なもん作った)
っで、ここからが問題。
C++なので、newして、確保したメモリに対してコンストラクタ呼ぶ必要があるのだが、上手くいかない。
いくつか理由が考えられるのだが、どれだろう?
1. そもそも無理。
2. 取得が上手くいっていなくて、変なアドレスを指してる。
3. その他
取れるアドレスは、単に関数のアドレスなので、適当に関数ポインタにキャストするのだが、
こんな感じであってるのか?
// operator new の関数ポインタ typedef void* (newP)(size_t); newP p = (newP)pointer; // pointerは取得したnewのシンボルアドレス void* buf = p(size); // 予定通りなら、bufには確保したメモリが入るはず・・・が、今のところ結果はセグメンテーションフォルト。
う~ん、なぜ?
BFD自体もあんまり知られて無いのか、ネットに情報があんまりないし・・・困った。
No comments:
Post a Comment