Здравствуйте, WoldemaR, Вы писали:
WR>отладчик (VC++2005) показывает разные значения для pfoo и &foo. WR>в чём может быть дело?
Не знаю, при работе показывает одинаковые:
char* p = (char*)&f;
printf("&f = 0x%08X, p = 0x%08X\n",&f,p);
WR>Если это не лечится, то как мне скопировать тело моей функции???
А ты уверен, что это получится? Твоя функция должна быть написана на PIC (position independent code).
Потом, по умолчанию компилятор (vc) генерит переходники на функции:
; переходник
0041102D E9 CE060000 JMP ctest.f [ctest.00411700]
...
; наша функция
00411700 55 PUSH EBP
...
00411728 C3 RETN ; конец функции
; вызов функции
004117AE E8 7AF8FFFF CALL ctest.0041102D
Соответственно, с переходниками ни размер функции толком не получить, ни скопировать её.
Здравствуйте, rus blood, Вы писали:
RB>Хочешь сказать, VS генерит переходники и в релизной версии тоже?
Нет, в релизной версии нет. Но порядок расположения функций в ехе может быть не определён (есть опция линкера /order, но не понятно, как ей пользоваться — видимо, функции должны быть экспортируемыми или хоты бы объявлены как public в obj):
typedef int (*PPrintf)(const char*,...);
typedef void (*PF)(char*,int,int,PPrintf);
// PICvoid f(char* p, int a, int b, PPrintf pprintf)
{
int c = a + b;
pprintf(p,c);
}
// заглушка для определения конца f()void f_end()
{
__asm int 3
}
int main(int argc,char* argv[])
{
puts("trying f: ");
f("\tf = %d\n",1,1,printf);
DWORD fSize = (DWORD)((char*)f_end - (char*)f);
PF pf = (PF)VirtualAlloc(NULL,fSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
memcpy(pf,(void*)f,fSize);
puts("trying f': ");
pf("\tf' = %d\n",2,3,printf);
puts("done.");
return 0;
}
Здравствуйте, WoldemaR, Вы писали:
WR>Здравствуйте, IceStudent, Вы писали:
WR>У меня твой код вот здесь срубает:
Из-за вышесказанного компилироваться должно в релизе. Добавь отладочную информацию и посмотри, в чём дело в отладчике. Может, линкер расположил функции в другом порядке, а может, вставлены переходники.
Здравствуйте, IceStudent, Вы писали:
WR>>У меня твой код вот здесь срубает: IS>Из-за вышесказанного компилироваться должно в релизе. Добавь отладочную информацию и посмотри, в чём дело в отладчике. Может, линкер расположил функции в другом порядке, а может, вставлены переходники.