<b>1.3.4 連結</b>
使用gcc指令進行目标檔案連結很簡單:
gcc hello.o –o
hello
gcc預設使用動态連結,如果要進行靜态連結,需加上-static選項:
hello –static
這樣生成的可執行檔案hello便能正常執行了。
我們使用objdump指令檢視一下靜态連結後的可執行檔案内的資訊。由于可執行檔案中包含了大量的c語言庫檔案,是以這裡不便将檔案的所有資訊展示出來,僅顯示最終main函數的可執行代碼。
080482c0
<main>:
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
<_io_printf>
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的偏移。