什么是符号表?


Answers:


82

符号表在这里有两种常见且相关的含义。

首先,目标文件中有符号表。通常,C或C ++编译器将单个源文件编译为扩展名为.obj或.o的目标文件。它包含可执行代码和数据的集合,链接器可以将这些可执行代码和数据处理为工作的应用程序或共享库。目标文件中有一个称为符号表的数据结构,该结构将目标文件中的不同项目映射到链接程序可以理解的名称。如果您从代码中调用函数,则编译器不会将例程的最终地址放入目标文件中。取而代之的是,它将占位符值放入代码中,并添加一条注释,告知链接器从其正在处理的所有目标文件中的各种符号表中查找引用,并将最终位置粘贴在该位置。

其次,共享库或DLL中也有符号表。这是由链接程序产生的,用于命名库用户可见的所有功能和数据项。这允许系统进行运行时链接,将对这些名称的开放引用解析为库在内存中的加载位置。

如果您想了解更多信息,我建议您使用John Levine的出色著作“链接器和加载器”。连结文字


嗨,本,在第二种情况下,您是指导出表吗?也就是说,导出表是符号表的特例吗?还是这些不相关的概念?
Pooven

你好 我相信它不在任何目标文件中,而是从它们引用的。其次,您能否再解释一下“最终位置”的含义?源代码中的物理地址或最终相对地址。
stdout

您提到的第二个是对分支或调用表的引用吗?
Nikos

26

简而言之,它是您将变量分配给其在内存中的地址的名称的映射,包括类型,范围和大小之类的元数据。由编译器使用。

通常,不只是C [++] *。从技术上讲,它并不总是包含直接内存地址。这取决于编译器所针对的语言,平台等。


我认为,说“它并不总是包含直接内存地址”来提及地址的内容非常重要。
stdout

13

在Linux中,您可以使用以下命令:

nm [目标文件]

列出该目标文件的符号表。然后,从此打印输出中,可以从使用中的链接器符号的错误名称中识别出它们。


8

符号表是程序/单元中“符号”的列表。符号通常是变量或函数的名称。符号表可用于确定变量或函数在存储器中的位置。



0

符号表是由编译器创建和维护的重要数据结构,用于存储有关各种实体(例如变量名,函数名,对象,类,接口等)的出现的信息。


链接器和汇编器还处理符号表(通常比编译器的表更简单)。
巴西尔·斯塔林凯维奇
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.