【问题标题】:What is a symbol table?什么是符号表?
【发布时间】:2010-09-09 07:21:19
【问题描述】:

谁能描述一下 C 和 C++ 上下文中的符号表是什么?

【问题讨论】:

    标签: c++ c symbol-table


    【解决方案1】:

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

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

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

    如果你想了解更多,我推荐 John Levine 的优秀书籍《Linkers and Loaders》。link text

    【讨论】:

    • 嗨,Ben,在第二种情况下,您指的是导出表吗?也就是说,导出表是符号表的特例吗?还是这些不相关的概念?
    • 嗨。我相信它不在任何目标文件中,而是从它们中引用的。其次,您能否再解释一下您所说的“最终位置”是什么意思?源代码中的物理地址或最终确定的相对地址。
    【解决方案2】:

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

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

    【讨论】:

    • 我认为,通过说“它并不总是包含直接内存地址”来提及地址的内容非常重要。
    【解决方案3】:

    在Linux中,你可以使用命令:

    nm [目标文件]

    列出该目标文件的符号表。从此打印输出中,您可以从mangled names 中破译正在使用的链接器符号。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        查看Symbol Table 维基百科条目。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 链接器和汇编器也处理符号表(通常比编译器更简单)。
          猜你喜欢
          • 1970-01-01
          • 2021-09-14
          • 1970-01-01
          • 2015-11-01
          • 2011-12-14
          • 2012-09-23
          • 2010-11-23
          • 1970-01-01
          • 2011-03-19
          相关资源
          最近更新 更多