offsetof
получает смещение элемента с начала структуры, но функции в этом смысле не (даже виртуальные функции). то, что вы, вероятно, после, это ключевое слово offset
:
class A
{
int Func1()
{
return 1;
}
};
__declspec(naked) int GetAddress()
{
__asm
{
mov eax, offset A::Func1
retn
}
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("0x%08X\n",GetAddress());
return 0;
}
Чтобы получить тот же эффект в GCC (я использую -masm = intel, так как -fasm-blocks - только apple), мы бы сделали (32-битный exe, протестирован под Windows 7, 64-битный, используя GCC 4.4):
class A
{
public:
int Func1() __attribute__((noinline))
{
return 1;
}
};
int a = 0; //this is bad, but it works for this demo
int GetAddress()// __attribute__((noinline))
{
__asm("mov dword ptr[_a], offset __ZN1A5Func1Ev");
return a;
}
int main()
{
A a;
printf("%d\n",a.Func1());
system("pause");
printf("0x%08X\n",GetAddress());
return 0;
}
Проблема с GCC заключается в том, что:
- Вы не можете связать с автоматически встроенными функциями, так как символ не генерируется (следовательно, нет строки).
- вам нужно привязать к декорированным символам, если вы не навязываете непокрашенные символы (и даже тогда будет какое-то украшение)