在软件库和框架开发的上下文中什么是符号
What is symbol in the context of Software library and framework development
我已经阅读了很多文档,例如 "finding correct symbols at runtime" 等。我进行了一些研究,但对于 "symbol" 究竟指的是什么,一直没有找到令人满意的答案。我的假设是符号只不过是源代码中定义的 类、方法、全局变量。但是为什么我们从库和框架的角度来谈,他们就叫symbol呢?
最简单的符号是编译代码(二进制文件)中的元数据,其中包含有关文件中函数和全局数据(全局变量和只读数据)的信息。通常一个符号包含名称、地址和大小。链接器(编译时的静态链接器或使用 DLL 时 运行 时的动态链接器)将使用此信息按名称查找每个函数和数据对象以执行链接。
在 C 等低级语言中,机器代码(例如 ELF)的常用文件格式除了函数的名称和地址外,不包含更多关于函数的信息。有关函数的其他信息(参数计数、类型,甚至调用约定)存储在单独的头文件中,必须与正确的库版本一起使用,否则会发生非常糟糕的事情。诸如 C++ 类 之类的东西甚至在编译代码中都不存在——它们被分解为函数和 vtables.
调试信息有时也可以称为 "symbols",因为它们密切相关。符号还通过使调试器能够通过比较地址找出它在哪个函数中停止或导致错误来帮助调试。调试符号是关于符号的额外信息,除了它们的名称和地址之外,它可以帮助调试器解释代码中的每一件事。
在 Microsoft 世界中,调试信息通常位于单独的 "PDB" 文件中,有时称为 "debug symbols",即使它们包含的信息比传统符号更多。这些文件还会带有内部函数和变量的符号,这些符号不会出现在主符号 table 中,因为其他东西不需要知道它们。原因是要保持主代码文件较小,并且只在需要时提供调试信息(大多数人不想 运行 调试器)。
我已经阅读了很多文档,例如 "finding correct symbols at runtime" 等。我进行了一些研究,但对于 "symbol" 究竟指的是什么,一直没有找到令人满意的答案。我的假设是符号只不过是源代码中定义的 类、方法、全局变量。但是为什么我们从库和框架的角度来谈,他们就叫symbol呢?
最简单的符号是编译代码(二进制文件)中的元数据,其中包含有关文件中函数和全局数据(全局变量和只读数据)的信息。通常一个符号包含名称、地址和大小。链接器(编译时的静态链接器或使用 DLL 时 运行 时的动态链接器)将使用此信息按名称查找每个函数和数据对象以执行链接。
在 C 等低级语言中,机器代码(例如 ELF)的常用文件格式除了函数的名称和地址外,不包含更多关于函数的信息。有关函数的其他信息(参数计数、类型,甚至调用约定)存储在单独的头文件中,必须与正确的库版本一起使用,否则会发生非常糟糕的事情。诸如 C++ 类 之类的东西甚至在编译代码中都不存在——它们被分解为函数和 vtables.
调试信息有时也可以称为 "symbols",因为它们密切相关。符号还通过使调试器能够通过比较地址找出它在哪个函数中停止或导致错误来帮助调试。调试符号是关于符号的额外信息,除了它们的名称和地址之外,它可以帮助调试器解释代码中的每一件事。
在 Microsoft 世界中,调试信息通常位于单独的 "PDB" 文件中,有时称为 "debug symbols",即使它们包含的信息比传统符号更多。这些文件还会带有内部函数和变量的符号,这些符号不会出现在主符号 table 中,因为其他东西不需要知道它们。原因是要保持主代码文件较小,并且只在需要时提供调试信息(大多数人不想 运行 调试器)。