gccと仮想関数へのポインタ
gcc って仮想関数のポインタをとろうとしたら、変な値が帰ってくる。
なんで?
//仮想/純粋仮想メソッドのテスト class Parent { public: virtual int f() { return 1; } virtual int g() =0; }; class Child : public Parent { public: int aaa() { return 100; } virtual int f() { return 2; } virtual int g() { return 3; } }; void main() { printf("&Child::aaa: %p\r\n", &Child::aaa); printf("&Child::f: %p\r\n", &Child::f); printf("&Child::g: %p\r\n", &Child::g); }
結果。
&Child::aaa: 00401127
&Child::f: 0040116D
&Child::g: 00401186
&Child::aaa: 0x804871c
&Child::f: 0x1 ← !?
&Child::g: 0x5 ← !?
あれー?
- 環境
gcc version 4.3.2 (Debian 4.3.2-1.1)
g++ -g -O0 main.cpp
これが出来ないから、sexyhookでは、仮想メソッドのフックは VC++にしか対応出来ていません。
gccで仮想メソッドのアドレスの位置を知る方法を知っている人教えてください。