Wednesday, 30 September 2009

アセンブラ

やっぱり、コンピュータの基本はアセンブラでしょ.. ってことで...

Cell/SPEのコードをPIC(Position Independent Code, 位置独立)にしないといけなくて、C では動いていたんですが...

C++のviritualが作るvtableに絶対アドレスが「アセンブラのハードコード」で入っているらしい。さすがに、そこまで調整するのは、gcc 自体をいじるしかない... lqr impure_ptr みたいな怪しいコードもあって、結構、厳しいっぽい。なので、C++ を諦める方向に。それで、いけるはずです。OSCで外人が「virtualがどうこう」と言ってたのは、vtable に絶対アドレスが入るってことだったのかも。

なんだが、ゼミの方では、また、コンパイラの出力がSEGVとな。コンパイラのデバッグって、SEGVの原因を見つけただけではだめで「その原因のコードを出力しているコンパイラのコードを見つける」という、なぞなぞのネタを探すみたいなデバッグが必要。これは、これで、また面白い。トランポリンが走っているので、一部のコードはスタックで動く。そこに来てないし。なんでだよ。

でも、gdb は、ディスアンセブラ内蔵なので、x/20i 0x5555 とかやると、一発で、そこに展開されたコードが読めます。ほとんど、あらゆるディスアセンブラが内蔵されてます。ソースコード読むと笑えます。

x/1i $pc とかで、次に実行される命令を見たり、b *0x80545とかでアドレス直書きで break point しかけたり。(*を付けると言うのを、どうやって捜し出したのか、自分でも良くわからない。でも、help break を見ると  Argument may be line number, function name, or "*" and an address.
とか書いてある。これだな。)

良くわからないところも多いが、まぁ、明日にはなんとかなるんじゃないか?

Post a Comment