符号表

在计算机科学中，符号表是一种用于语言翻译器（例如编译器和解释器）中的数据结构。在符号表中，程序源代码中的每个标识符都和它的声明或使用信息绑定在一起，比如其数据类型、作用域以及内存地址。

实现
散列表是用来实现符号表的一种常用技术。编译器可能会使用一个很大的符号表来包含所有的符号，或是针对不同的作用域使用层次结构的多个独立的符号表。

使用
目标文件中通常会有一个包含了所有外部可见标识符的符号表。在链接不同的目标文件时，链接器会使用这些文件中的符号表来解析所有未解析的符号引用。

符号表可能只存在于翻译阶段，也可能被嵌入到该阶段的输出文件中，以供后续阶段使用。比如，它可用于交互式的调试器中，也可以在程序执行过程中或结束后提供格式化的诊断报告。

在逆向工程中，许多工具会通过符号表来检查全局变量和已知函数的地址。如果可执行文件的符号表被strip这样的工具去除掉了，则逆向工程会更加困难。

在进行动态内存分配和变量访问时，编译器需要完成许多工作，其中扩展的栈模型就需要用到符号表。

示例

下图是一个小程序的符号表。该表是用GNU Binutils中的nm工具生成的。其中有一个数据类型符号（由类型 "D" 表明）和许多函数（自己定义的以及标准库中的）。第一列是每个符号在内存中的位置，第二列是"符号类型 "，而第三列则是符号名称。通过传递适当的参数，可以按照地址顺序生成该符号表。

参见
Debug symbol

编译器软件
数据结构