符號表
此條目沒有列出任何參考或來源。 (2014年3月5日) |
在計算機科學中,符號表是一種用於語言翻譯器(例如編譯器和解釋器)中的數據結構。在符號表中,程序源代碼中的每個標識符都和它的聲明或使用信息綁定在一起,比如其數據類型、作用域以及內存地址。
實現
散列表是用來實現符號表的一種常用技術。編譯器可能會使用一個很大的符號表來包含所有的符號,或是針對不同的作用域使用層次結構的多個獨立的符號表。
使用
目標文件中通常會有一個包含了所有外部可見標識符的符號表。在鏈接不同的目標文件時,鏈接器會使用這些文件中的符號表來解析所有未解析的符號引用。
符號表可能只存在於翻譯階段,也可能被嵌入到該階段的輸出文件中,以供後續階段使用。比如,它可用於交互式的調試器中,也可以在程序執行過程中或結束後提供格式化的診斷報告。
在逆向工程中,許多工具會通過符號表來檢查全局變量和已知函數的地址。如果可執行文件的符號表被strip這樣的工具去除掉了,則逆向工程會更加困難。
在進行動態內存分配和變量訪問時,編譯器需要完成許多工作,其中擴展的棧模型就需要用到符號表。
示例
下圖是一個小程序的符號表。該表是用GNU Binutils中的nm工具生成的。其中有一個數據類型符號(由類型 "D" 表明)和許多函數(自己定義的以及標準庫中的)。第一列是每個符號在內存中的位置,第二列是"符號類型 (頁面存檔備份,存於網際網路檔案館)",而第三列則是符號名稱。通過傳遞適當的參數,可以按照地址順序生成該符號表。
地址 | 類型 | 名稱 |
---|---|---|
00000020 | a | T_BIT |
00000040 | a | F_BIT |
00000080 | a | I_BIT |
20000004 | t | irqvec |
20000008 | t | fiqvec |
2000000c | t | InitReset |
20000018 | T | _main |
20000024 | t | End |
20000030 | T | AT91F_US3_CfgPIO_useB |
2000005c | t | AT91F_PIO_CfgPeriph |
200000b0 | T | main |
20000120 | T | AT91F_DBGU_Printk |
20000190 | t | AT91F_US_TxReady |
200001c0 | t | AT91F_US_PutChar |
200001f8 | T | AT91F_SpuriousHandler |
20000214 | T | AT91F_DataAbort |
20000230 | T | AT91F_FetchAbort |
2000024c | T | AT91F_Undef |
20000268 | T | AT91F_UndefHandler |
20000284 | T | AT91F_LowLevelInit |
200002e0 | t | AT91F_DBGU_CfgPIO |
2000030c | t | AT91F_PIO_CfgPeriph |
20000360 | t | AT91F_US_Configure |
200003dc | t | AT91F_US_SetBaudrate |
2000041c | t | AT91F_US_Baudrate |
200004ec | t | AT91F_US_SetTimeguard |
2000051c | t | AT91F_PDC_Open |
2000059c | t | AT91F_PDC_DisableRx |
200005c8 | t | AT91F_PDC_DisableTx |
200005f4 | t | AT91F_PDC_SetNextTx |
20000638 | t | AT91F_PDC_SetNextRx |
2000067c | t | AT91F_PDC_SetTx |
200006c0 | t | AT91F_PDC_SetRx |
20000704 | t | AT91F_PDC_EnableRx |
20000730 | t | AT91F_PDC_EnableTx |
2000075c | t | AT91F_US_EnableTx |
20000788 | T | __aeabi_uidiv |
20000788 | T | __udivsi3 |
20000884 | T | __aeabi_uidivmod |
2000089c | T | __aeabi_idiv0 |
2000089c | T | __aeabi_ldiv0 |
2000089c | T | __div0 |
200009a0 | D | _data |
200009a0 | A | _etext |
200009a0 | D | holaamigosh |
200009a4 | A | __bss_end__ |
200009a4 | A | __bss_start |
200009a4 | A | __bss_start__ |
200009a4 | A | _edata |
200009a4 | A | _end |