1.程序編譯過程
在平時,源文件到目標文件是如下圖轉換,我們今天來着重分析hello.o,也就是標題的重定位目標文件。
2.目標文件的分類
目標文件有三種形式。
- 可重定位目標文件,包含二進制代碼和數據,在編譯時可以與其他可重定位文件合併,創建一個可執行目標文件。
- 可執行目標文件, 包含二進制代碼和數據,其可被直接複製到內存並執行。
- 共享目標文件,一種特殊類型的可重定位目標文件,可以在加載或者運行時被動態的加載進內存並鏈接。
3.可重定位文件的生成
我在Ubuntu裏面先編寫一個hello world 的C程序。
#include<stdio.h>
int main(){
printf("hello world");
return 0;
}
然後使用Linux的gcc命令使生成可重定位文件
gcc -c hello.c
如圖
我們可以在文件中發現多了一個 hello.o的文件
這個就是前面提到的可重定位目標文件。
4.解析可重定位目標文件
1.ELF:可執行可鏈接格式(Executable and Linkable Format, ELF)。
其中夾在ELF頭和字頭部表之間的都是節。
一個典型的ELF可重定位目標文件就包含上圖中幾個節。
我們可以用如下幾個指令進行查看並運用。
2.使用readelf -S查看hello.o
3.使用readelf -h查看hello.o
4.使用readelf -s查看hello.o