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