Wednesday 21 July 2010

Overlay の続き

なので外部参照を追い出すためには、システムコールとかは、テーブル参照にすれば良いから...

C++ のメソッドへのポインタの配列を作って... メソッドの型は、いろいろなので、配列自体は void * にして... cast すれば良くって...

SchedTask::get_cpu_id(int i) {
(* ((Scheduler::*)(int)) table[GetCPUid])(i);
}

とかってすると... (これをすらすら書けるやつは、そうはいまい...)

invalid cast from void * to (Scheduler::*)(int)

へ? どっちもポインタなんだから、問題ないはずなんですが。なんでダメなんだよ。

つうか、virtual method では同じことやっているはずじゃん! ユーザにだけ使わせないのはずるい。

と思った瞬間わかりました。

virtual get_cpu_id(int i) { return 0; }

自動的に表引きになるじゃん。なので、システムコールをvirtualにすれば、外部参照は生じないってのわかりました。楽勝じゃん!

でも、なんか、

% nm Hello.o
00000050 t ____LLLL
0000004c t ____LLLL1
U __gxx_personality_sj0

とかいっているんですが。 gxx_personallity ってなんだ? でも、objdump -d で見る限り外部参照ではないみたいなので無視して良いのかな。

でも、これから、*.o をread で読み込んで elf header を読んで、alignment に沿って load とかの楽しいプログラミングが待っているらしいです。

No comments: