линковка функций в сишке

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by zzz_nec, 18 Nov 2007.

  1. zzz_nec

    zzz_nec New Member

    Joined:
    17 Nov 2007
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    есть код на 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)
    и получить адрес начала секции
     
  2. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    1) jmp'ы делаются в debug-версиях и отключаются не помню, чем. с оптимизацией их не будет.
    2) а получить операнд jmp не судьба?
    проверяешь если там 0xe9 (jmp far) - берешь след. 4 байта - далее корректируешь отн. текущего места первого байта и получается адрес, куда идет прыжок.
     
  3. GlOFF

    GlOFF Elder - Старейшина

    Joined:
    8 May 2006
    Messages:
    689
    Likes Received:
    484
    Reputations:
    4
    zzz_nec Это все особенности конкретного линкеровщика. Мой на VC++ 6.0 выдал вот такой результат:

    Code:
    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
    
    Как ты и хотел сразу прыжок на функцию :)
     
  4. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    это особенности линкера, как уже сказали.
    посмотри документацию к линкеру
     
    2 people like this.