使用ld鏈接器將“a.o”和"b.o"鏈接起來(lái):
ld a.o b.o -e main -o ab
-e main 表示將main函數(shù)作為程序入口,ld鏈接器默認(rèn)的程序入口的為_start.
-o ab表示鏈接輸出文件名為ab,默認(rèn)為a.out
objdump -d a反匯編a代碼
objdump -r查看目標(biāo)文件重定位表
ELF定義了兩種特殊段:
.init該段里面保存的是可執(zhí)行指令,它構(gòu)成了進(jìn)程的初始化代碼。
.fini該段保存著進(jìn)程終止代碼指令。
API往往是指源代碼級(jí)別的接口,ABI指二進(jìn)制層面的接口。ABI的兼容程序比API要更為嚴(yán)格。
一個(gè)靜態(tài)庫(kù)可以簡(jiǎn)單地看成一組目標(biāo)文件的集合,比如在Linux中最常用的C語(yǔ)言靜態(tài)庫(kù)libc位于/usr/lib/libc.a,它屬于glibc項(xiàng)目的一部分;像windows這樣的平臺(tái)上,最常使用的C語(yǔ)言庫(kù)是由集成開始環(huán)境所附帶的運(yùn)行庫(kù)。
通常使用"ar"壓縮程序?qū)⒘闵⒌哪繕?biāo)文件壓縮到一起,并且對(duì)其進(jìn)行編號(hào)和索引,以便于查找和檢索,就形成了libc.a這個(gè)靜態(tài)庫(kù)文件。
ar -t libc.a
查看這個(gè)文件包含了哪些目標(biāo)文件。
gcc -static --verbose -fno-builtin hello.c
以上把整個(gè)編譯鏈接過(guò)程的步驟打印出來(lái)