天天看點

自己動手構造編譯系統:編譯、彙編與連結1.3.4 連結

<b>1.3.4  連結</b>

  

         使用gcc指令進行目标檔案連結很簡單:

gcc hello.o –o

hello

  gcc預設使用動态連結,如果要進行靜态連結,需加上-static選項:

hello –static

  這樣生成的可執行檔案hello便能正常執行了。

  我們使用objdump指令檢視一下靜态連結後的可執行檔案内的資訊。由于可執行檔案中包含了大量的c語言庫檔案,是以這裡不便将檔案的所有資訊展示出來,僅顯示最終main函數的可執行代碼。

080482c0

&lt;main&gt;:

 80482c0:         55                       push          %ebp

 80482c1:         89

e5                    mov           %esp,%ebp

 80482c3:         83

e4 f0                 and      $0xfffffff0,%esp

 80482c6:         83

ec 10                 sub      $0x10,%esp

 80482c9:         b8

28 e8 0a 08           mov           $0x80ae828,%eax

 80482ce:         89

04 24                 mov           %eax,(%esp)

 80482d1:         e8

fa 0a 00 00       call       8048dd0

&lt;_io_printf&gt;

 80482d6:         b8

00 00 00 00     mov           $0x0,%eax

 80482db:         c9                       leave 

 80482dc:         c3                       ret

  從main函數的可執行代碼中,我們發現彙編過程中描述的無法确定的符号位址資訊在這裡都被修正為實際的符号位址。如“hello world !”字元串的位址為0x080ae828,printf函數的位址為0x08048dd0。這裡符号_io_printf與printf完全等價,call指令内部相對位址為0x000afa,正好是printf位址相對于call指令下條指令起始位址0x080482d6的偏移。

繼續閱讀