比方說,我們有:C全局靜態變量初始化是由鏈接器完成的?
在f1.c
#include <stdio.h>
static int x = 10;
void f1() {
printf("f1.c : %d\n", x);
}
的main.c
我們將編譯和閱讀兩個ELF文件symboltables(相對ELF和exec ELF。):
$> gcc -c *.c
$> readelf -s f1.o | grep x
Num: Value Size Type Bind Vis Ndx Name
5: 0000000000000000 4 OBJECT LOCAL DEFAULT 3 x
$> gcc *.o
$> readelf -s a.out | grep x
Num: Value Size Type Bind Vis Ndx Name
38: 0000000000601038 4 OBJECT LOCAL DEFAULT 25 x
我可以看到Value
(也稱爲地址),其中全局靜態變量x
是0000000000000000
從讀取可重定位目標文件f1.o
。
這意味着我們還沒有初始化它,因爲它仍然是一個rel。 ELF對象文件和鏈接器將處理此問題。
所以我的問題是,如果鏈接器是在鏈接0000000000601038
後將已知地址設置爲x
的值爲10的鏈接器,那麼它是如何實現的?鏈接器獲取信息到將值設置爲10以及誰提供此信息(f1.o
?)?
這裏的值是變量'x'的*地址*,而不是'x'的值 –
@ChrisDodd是的,我已經注意到在最初的問題已經不是混淆了,我看看它是如何聽起來像我的意思是它沒有被初始化,因爲那個。 – Seoul