Linux環境下:程序的鏈接, 裝載和庫[靜態鏈接]
看以下例子
main.c
extern int x;
int main()
{
int y = 100;
swap(&x,&y);
return 0;
}
int x = 1;
void swap(int* x, int* y)
{
int temp = *x;
*x = *y;
*y = temp;
}
段的合并
main.o
swap.o
鏈接生成靜態庫: ld main.o swap.o -e main -o stlink
將多個目標鏈接生成可執行文件,默認好像是靜態鏈接
可以看到生成的stlink的.text
.data
的大小是原先兩個文件之和。2c + 2c = 58
重定位
main.o 反匯編 objdump -d -s main.o
swap.o
通過 objdump -r main.o
查看目標文件中有哪些是需要重定位的符號
可以看到main.o中的.text
段有兩個符號需要重定位,一個是參數x,一個swap函數,OFFSET分別是17和21。從相應的從main.o 反匯編中可以看到這兩個offset處的地址都是 00 00 00 00 是因為在生成main.o的時候還無法確認這些符號的位置(中間b8也是00.. 是為啥?)。
通過readelf -s main.o
也可以得到相同的結果(圖中的x和swap是UNDEFINED的)
重定位后 objdump -d -s stlink
可以上面需要relocate的位置已經被替換了 參數x 替換成了 600198 這個對應合并后 .data
段的絕對地址。
函數swap則是使用的相對尋址 絕對地址是400114,相對地址=下一定要執行的地址和真實swap地址的偏移(400114-40010d=7)
本文來自博客園,作者:Aitozi,轉載請注明原文鏈接:http://www.qzems.com/Aitozi/p/17092543.html