在可重定位目標(biāo)文件中,符號(hào)表實(shí)際是為了標(biāo)識(shí)出符號(hào)定義于何處,即符號(hào)表?xiàng)l目中的 section/Ndx 記錄了這個(gè)符號(hào)定義在哪個(gè)節(jié)。
- 對(duì)于在該模塊定義的全局符號(hào),符號(hào)表中很明確的給出了定義在何處
- 而對(duì)于引用的外部符號(hào),符號(hào)表中也會(huì)出現(xiàn)這個(gè)條目,但符號(hào)表不知道該符號(hào)定義在哪里,所以在符號(hào)解析時(shí),才會(huì)知道具體定義在哪個(gè)節(jié)。
符號(hào)表的主要功能就是記錄定義或引用的全局符號(hào)定義在哪個(gè)位置,等到符號(hào)解析時(shí)將多個(gè)文件的符號(hào)表進(jìn)行整合,確保每一個(gè)引用都可以對(duì)應(yīng)上其定義,而不是說記錄了符號(hào)在哪里被引用了,或引用了多少次。
符號(hào)表中存在三類符號(hào):
- 全局符號(hào):定義在本模塊的全局變量和函數(shù),和是否被該模塊引用過無關(guān)。
- 外部符號(hào):引用定義了其他模塊的全局符號(hào)。即便這些符號(hào)被聲明了,但沒有進(jìn)行引用,也不會(huì)出現(xiàn)在符號(hào)表中。
- 局部符號(hào)
int unusedg_x = 3;
int g_x = 5;
extern int unusede_x;
extern int e_x;
int unused_test();
int used_test();
int main(){
int a = 5;
used_test();
g_x = a;
g_x = a;
e_x = a;
used_test();
}
其中全局符號(hào) unusedg_x 定義了未被引用,g_x 定義了被引用了兩次。
其中外部全局變量 unusede_x 聲明了未被引用,e_x 聲明后被引用了一次。
外部函數(shù) unused_test() 聲明后未被引用, used_test() 聲明后被引用了兩次。
Num: Value Size Type Bind Vis Ndx Name
8: 0000000000000000 4 OBJECT GLOBAL DEFAULT 3 unusedg_x
9: 0000000000000004 4 OBJECT GLOBAL DEFAULT 3 g_x
10: 0000000000000000 69 FUNC GLOBAL DEFAULT 1 main
11: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND used_test
12: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND e_x
- 定義在該模塊中無論是否被該模塊函數(shù)引用的符號(hào),只會(huì)在符號(hào)表中出現(xiàn)一次
- 沒有被引用,但是聲明了的外部符號(hào)不會(huì)出現(xiàn)在該模塊的符號(hào)表中
- 符號(hào)表中沒有重復(fù)的符號(hào),即便是被引用多次
- 符號(hào)表中條目的主要意義就是標(biāo)識(shí)符號(hào)被定義的位置,便于讓其他模塊引用、記錄未定義且引用了的外部符號(hào),在鏈接時(shí)從其他模塊的符號(hào)表中找到該符號(hào)的定義。