PDA

Просмотр полной версии : линковка функций в сишке


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
это особенности линкера, как уже сказали.
посмотри документацию к линкеру