Скопировать тело функции
От: WoldemaR Россия  
Дата: 29.08.06 07:09
Оценка: :)
Есть вот такой код:

void foo()
{
}

int main()
{
    char *pfoo = (char*)&foo;
// вот здесь смотрим отладчиком
}


отладчик (VC++2005) показывает разные значения для pfoo и &foo.

в чём может быть дело?

Если это не лечится, то как мне скопировать тело моей функции???
Re: Скопировать тело функции
От: IceStudent Украина  
Дата: 29.08.06 10:24
Оценка: 4 (1)
Здравствуйте, 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


Соответственно, с переходниками ни размер функции толком не получить, ни скопировать её.
--
wbr, icestudent
Re[2]: Скопировать тело функции
От: WoldemaR Россия  
Дата: 29.08.06 10:26
Оценка:
Здравствуйте, IceStudent, Вы писали:


IS>Соответственно, с переходниками ни размер функции толком не получить, ни скопировать её.


Точно. так и есть.
Re[2]: Скопировать тело функции
От: rus blood Россия  
Дата: 29.08.06 10:27
Оценка:
Здравствуйте, IceStudent, Вы писали:

IS>Соответственно, с переходниками ни размер функции толком не получить, ни скопировать её.


Хочешь сказать, VS генерит переходники и в релизной версии тоже?
Имею скафандр — готов путешествовать!
Re[3]: Скопировать тело функции
От: IceStudent Украина  
Дата: 29.08.06 11:16
Оценка: 7 (1)
Здравствуйте, rus blood, Вы писали:

RB>Хочешь сказать, VS генерит переходники и в релизной версии тоже?

Нет, в релизной версии нет. Но порядок расположения функций в ехе может быть не определён (есть опция линкера /order, но не понятно, как ей пользоваться — видимо, функции должны быть экспортируемыми или хоты бы объявлены как public в obj):
typedef int (*PPrintf)(const char*,...);
typedef void (*PF)(char*,int,int,PPrintf);

// PIC
void 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;
}
--
wbr, icestudent
Re[4]: Скопировать тело функции
От: WoldemaR Россия  
Дата: 29.08.06 11:28
Оценка:
Здравствуйте, IceStudent, Вы писали:

У меня твой код вот здесь срубает:
IS>    pf("\tf' = %d\n",2,3,printf);
Re[5]: Скопировать тело функции
От: IceStudent Украина  
Дата: 29.08.06 11:52
Оценка:
Здравствуйте, WoldemaR, Вы писали:

WR>Здравствуйте, IceStudent, Вы писали:


WR>У меня твой код вот здесь срубает:

Из-за вышесказанного компилироваться должно в релизе. Добавь отладочную информацию и посмотри, в чём дело в отладчике. Может, линкер расположил функции в другом порядке, а может, вставлены переходники.
--
wbr, icestudent
Re[6]: Скопировать тело функции
От: WoldemaR Россия  
Дата: 29.08.06 12:17
Оценка:
Здравствуйте, IceStudent, Вы писали:

WR>>У меня твой код вот здесь срубает:

IS>Из-за вышесказанного компилироваться должно в релизе. Добавь отладочную информацию и посмотри, в чём дело в отладчике. Может, линкер расположил функции в другом порядке, а может, вставлены переходники.

Так точно. в релизе работает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.