符号表

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

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

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

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

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

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

示例
右侧是一个小程序的符号表。该表是用GNU Binutils中的nm工具生成的。其中有一个数据类型符号（由类型 "D" 表明）和许多函数（自己定义的以及标准库中的）。第一列是每个符号在内存中的位置，第二列是"符号类型"符号类型 ，而第三列则是符号名称。通过传递适当的参数，可以按照地址顺序生成该符号表。
+样例表格: SysV ABI 地址  类型  名字00000020  a  T_BIT00000040  a  F_BIT00000080  a  I_BIT20000004  t  irqvec20000008  t  fiqvec2000000c  t  InitReset20000018  T  _main20000024  t  End20000030  T  AT91F_US3_CfgPIO_useB2000005c  t  AT91F_PIO_CfgPeriph200000b0  T  main20000120  T  AT91F_DBGU_Printk20000190  t  AT91F_US_TxReady200001c0  t  AT91F_US_PutChar200001f8  T  AT91F_SpuriousHandler20000214  T  AT91F_DataAbort20000230  T  AT91F_FetchAbort2000024c  T  AT91F_Undef20000268  T  AT91F_UndefHandler20000284  T  AT91F_LowLevelInit200002e0  t  AT91F_DBGU_CfgPIO2000030c  t  AT91F_PIO_CfgPeriph20000360  t  AT91F_US_Configure200003dc  t  AT91F_US_SetBaudrate2000041c  t  AT91F_US_Baudrate200004ec  t  AT91F_US_SetTimeguard2000051c  t  AT91F_PDC_Open2000059c  t  AT91F_PDC_DisableRx200005c8  t  AT91F_PDC_DisableTx200005f4  t  AT91F_PDC_SetNextTx20000638  t  AT91F_PDC_SetNextRx2000067c  t  AT91F_PDC_SetTx200006c0  t  AT91F_PDC_SetRx20000704  t  AT91F_PDC_EnableRx20000730  t  AT91F_PDC_EnableTx2000075c  t  AT91F_US_EnableTx20000788  T  __aeabi_uidiv20000788  T  __udivsi320000884  T  __aeabi_uidivmod2000089c  T  __aeabi_idiv02000089c  T  __aeabi_ldiv02000089c  T  __div0200009a0  D  _data200009a0  A  _etext200009a4  A  __bss_end__200009a4  A  __bss_start200009a4  A  __bss_start__200009a4  A  _edata200009a4  A  _end

下面是用C写的代码:
// Declare an external function
extern double bar(double x);

// Define a public function
double foo(int count)
{
    double sum = 0.0;

    // Sum all the values bar(1) to bar(count)
    for (int i = 1; i <= count; i++)
        sum += bar((double) i);
    return sum;
}

C编译器的输出至少包含如下符号表项目：
 符号名字 类型 作用域 bar  function, double  extern x  double  function parameter foo  function, double  global count  int  function parameter sum  double  block local i  int  for-loop statement

参见

参考文献

Category:编译器软件
Category:数据结构