符號表

維基百科,自由的百科全書
跳轉到: 導覽搜尋

電腦科學中,符號表是一種用於語言翻譯器(例如編譯器直譯器)中的資料結構。在符號表中,程式原始碼中的每個識別元都和它的宣告或使用訊息繫結在一起,比如其資料型別作用域以及記憶體位址

實作[編輯]

雜湊表是用來實作符號表的一種常用技術。編譯器可能會使用一個很大的符號表來包含所有的符號,或是針對不同的作用域使用階層的多個獨立的符號表。

使用[編輯]

目的檔中通常會有一個包含了所有外部可見識別元的符號表。在連結不同的目的檔時,連結器會使用這些檔案中的符號表來解析所有未解析的符號參照。

符號表可能只存在於翻譯階段,也可能被嵌入到該階段的輸出檔案中,以供後續階段使用。比如,它可用於互動式的偵錯程式中,也可以在程式執行過程中或結束後提供格式化的診斷報告。

在逆向工程中,許多工具會透過符號表來檢查全域變數和已知函式的位址。如果執行檔的符號表被strip這樣的工具去除掉了,則逆向工程會更加困難。

在進行動態記憶體分配和變數存取時,編譯器需要完成許多工作,其中擴充功能的棧模型就需要用到符號表。

範例[編輯]

下圖是一個小程式的符號表。該表是用GNU Binutils中的nm工具生成的。其中有一個資料型別符號(由型別 "D" 表明)和許多函式(自己定義的以及標準庫中的)。第一列是每個符號在記憶體中的位置,第二列是"符號型別",而第三列則是符號名稱。透過傳遞適當的參數,可以按照位址順序生成該符號表。

Example table
位址 型別 名稱
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

參見[編輯]