Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   линковка функций в сишке (https://forum.antichat.xyz/showthread.php?t=53877)

zzz_nec 19.11.2007 00:00

линковка функций в сишке
 
есть код на C

void foo(void);

void main(){
foo();
}

void foo(void){
return;
}

компилирует,линкуем...смотр им дизасм...там што то вроди

j_foo PROC
jmp _foo
j_foo ENDP

_main PROC
push ebp
mov ebp,esp

call j_foo (*)

mov esp,ebp
pop ebp
ret
_main ENDP

_foo PROC
push ebp
mov ebp,esp

mov esp,ebp
pop ebp
ret
_foo ENDP

а как сделать што бы в (*) было сразу call _foo
или
как получить адрес самой функции, а не джампа на нее

единственное што знаю - это написать #pragma alloc_text("sect",foo)
и получить адрес начала секции

KEZ 19.11.2007 00:11

1) jmp'ы делаются в debug-версиях и отключаются не помню, чем. с оптимизацией их не будет.
2) а получить операнд jmp не судьба?
проверяешь если там 0xe9 (jmp far) - берешь след. 4 байта - далее корректируешь отн. текущего места первого байта и получается адрес, куда идет прыжок.

GlOFF 19.11.2007 01:00

zzz_nec Это все особенности конкретного линкеровщика. Мой на VC++ 6.0 выдал вот такой результат:

Код:

00401000 >/$ 55            PUSH EBP
00401001  |. 8BEC          MOV EBP,ESP
00401003  |. E8 08000000    CALL 1.00401010
00401008  |. 5D            POP EBP
00401009  \. C3            RETN
0040100A    CC            INT3
0040100B    CC            INT3
0040100C    CC            INT3
0040100D    CC            INT3
0040100E    CC            INT3
0040100F    CC            INT3
00401010  /$ 55            PUSH EBP
00401011  |. 8BEC          MOV EBP,ESP
00401013  |. 5D            POP EBP
00401014  \. C3            RETN

Как ты и хотел сразу прыжок на функцию :)

_Great_ 19.11.2007 11:05

это особенности линкера, как уже сказали.
посмотри документацию к линкеру


Время: 13:48