我已经阅读了许多文档,例如“在运行时找到正确的符号”等。我已经研究了一下,但从未找到一个令人满意的答案,正是“符号”指的是什么。我的假设是符号只不过是源代码中定义的类,方法,全局变量。但是,当我们从图书馆和框架的角度谈论时,为什么它们被称为符号?
答案 0 :(得分:2)
在最简单的级别,符号是编译代码(二进制文件)中的元数据,其中包含有关文件中的函数和全局数据(全局变量和只读数据)的信息。通常,符号包含名称,地址和大小。链接器(编译时的静态链接器或使用DLL时的动态链接器)将使用此信息按名称查找每个函数和数据对象以执行链接。
在诸如C的低级语言中,机器代码(例如ELF)的惯用文件格式除了名称和地址之外,不包含有关函数的更多信息。关于函数的其他信息(参数计数,类型,甚至调用约定)存储在单独的头文件中,这些文件必须与正确的库版本一起使用,否则会发生非常糟糕的事情。诸如C ++类之类的东西在编译代码中并不存在 - 它们被分解为函数和vtable。
调试信息有时也可称为“符号”,因为它密切相关。符号还有助于调试,方法是让调试器通过比较地址找出它停止的功能或导致错误。调试符号是关于符号的额外信息,除了它们的名称和地址之外,它们有助于调试器解释代码中的每一个东西。
在Microsoft世界中,调试信息通常位于单独的“PDB”文件中,有时称为“调试符号”,即使它们包含的信息多于传统符号。这些文件还带有内部函数和变量的符号,这些符号不在主符号表中,因为其他东西不需要知道它们。原因是保持主代码文件较小,并且只在需要时提供调试信息(大多数人不想运行调试器)。