2009-07-29 67 views
8

我想知道鏈接器如何解析下面彙編代碼中的printf符號。鏈接器如何解析彙編代碼中的符號

#include<stdio.h> 
void main() 
{ 
    printf("Hello "); 
} 




    .file "test.c" 
    .def ___main; .scl 2; .type 32; .endef 
    .section .rdata,"dr" 
LC0: 
    .ascii "Hello \0" 
    .text 
.globl _main 
    .def _main; .scl 2; .type 32; .endef 
_main: 
    pushl %ebp 
    movl %esp, %ebp 
    subl $8, %esp 
    andl $-16, %esp 
    movl $0, %eax 
    addl $15, %eax 
    addl $15, %eax 
    shrl $4, %eax 
    sall $4, %eax 
    movl %eax, -4(%ebp) 
    movl -4(%ebp), %eax 
    call __alloca 
    call ___main 
    movl $LC0, (%esp) 
    **call _printf** 
    leave 
    ret 
    .def **_printf**; .scl 3; .type 32; .endef 

位低位說明將不勝感激。

在此先感謝。

+1

一個很好的問題沒有被問到,並導致大量的「未解決符號」問題! – xtofl 2009-07-29 11:22:06

回答

17

假設ELF文件格式,彙編程序將在目標文件中生成未定義的符號引用。這會是這樣的:

 
Symbol table '.symtab' contains 11 entries: 
    Num: Value Size Type Bind Vis  Ndx Name 
    0: 00000000  0 NOTYPE LOCAL DEFAULT UND 
    1: 00000000  0 FILE LOCAL DEFAULT ABS test.c 
    2: 00000000  0 SECTION LOCAL DEFAULT 1 
    3: 00000000  0 SECTION LOCAL DEFAULT 3 
    4: 00000000  0 SECTION LOCAL DEFAULT 4 
    5: 00000000  0 SECTION LOCAL DEFAULT 5 
    6: 00000000  0 SECTION LOCAL DEFAULT 6 
    7: 00000000  0 SECTION LOCAL DEFAULT 7 
    8: 00000000 52 FUNC GLOBAL DEFAULT 1 main 
    9: 00000000  0 NOTYPE GLOBAL DEFAULT UND printf 
    10: 00000000  0 NOTYPE GLOBAL DEFAULT UND exit 

它還會創建一個重定位表項指向需要用正確的地址鏈接器更新的代碼鏡像的一部分。它看起來是這樣的:

 
tool2 0>readelf -r test.o 

Relocation section '.rel.text' at offset 0x358 contains 3 entries: 
Offset  Info Type   Sym.Value Sym. Name 
0000001f 00000501 R_386_32   00000000 .rodata 
00000024 00000902 R_386_PC32  00000000 printf 
00000030 00000a02 R_386_PC32  00000000 exit 

然後,鏈接器的工作就是遍歷重定位表,通過最終符號地址修改代碼圖像。

有一本很好的書,但我現在找不到細節(並且已經絕版)。但是,這看起來可能有用:http://www.linuxjournal.com/article/6463

Dave。

+0

令人印象深刻的答案戴夫。非常清楚地劃定。非常感謝。如果你能提醒你自己,並且讓我閱讀那本書,這對你來說會很棒:) – mahesh 2009-07-29 12:26:44

1

有關鏈接過程的好書,請參閱John Levine的Linkers & Loaders。您可以獲取HTML格式的手稿章節here

1

一篇可能對你有幫助的論文是Ulrich Drepper的How To Write Shared Libraries。 Ulritch是Linux glibc的維護者,他是ELF的權威人士。

儘管本文討論如何編寫共享庫以及如何導出或不導出符號,它解釋瞭如何在ELF格式的exe文件中動態解析這些符號。

我想它可能會回答你的問題。

+0

謝謝你的鏈接:)。看起來不錯。 – mahesh 2009-07-30 03:18:35