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 ← !?

あれー?

  • 環境

VC++ ver6/ver 2008
デバッグビルド

gcc version 4.3.2 (Debian 4.3.2-1.1)
g++ -g -O0 main.cpp

これが出来ないから、sexyhookでは、仮想メソッドのフックは VC++にしか対応出来ていません。
gccで仮想メソッドのアドレスの位置を知る方法を知っている人教えてください。