第七章 鏈接——關(guān)于符號(hào)表的一些筆記與總結(jié)

在可重定位目標(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)的定義。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容