像可执行文件这样的二进制文件是由符号组成的吗?调试符号就是其中的一种?如何理解符号?
lzfw57am1#
下面是一个非常高层次的解释:首先,符号不仅仅存在于C世界中。当用一些特定的设置构建时,它们存在于一些高级语言如C、C等的二进制文件中。
int i = 2;
在二进制文件中,i只是一个内存位置(例如0x10203040),它正在使用2进行初始化。没有名为i的内存位置。名称i是通过与二进制文件一起加载的调试符号分配给该内存位置的(当用某些标志构建时),它维护“存储器位置”到“源代码级名称”Map。例如,PE文件格式提供了Debug目录,其中存储了有关调试符号的信息。这些在调试时非常有用,因为在没有此类调试符号的情况下,仅根据二进制0和1进行调试将是一项真正具有挑战性的任务。因此,当您调试此类二进制文件时(其具有上面的i的定义),其已经用调试标志构建,调试器通过PE文件中的调试目录知道存储器位置“0x10203040”对应于i。
i
crcmnpdw2#
呃,不。可执行文件包含机器码。以及全局变量的初始化值。在Windows上,调试信息通常存储在一个单独的文件中,一个. pdb。来自该文件的关于程序中的函数或变量的调试数据称为符号。dbghelp API是described here。
2条答案
按热度按时间lzfw57am1#
下面是一个非常高层次的解释:
首先,符号不仅仅存在于C世界中。当用一些特定的设置构建时,它们存在于一些高级语言如C、C等的二进制文件中。
在二进制文件中,
i
只是一个内存位置(例如0x10203040),它正在使用2进行初始化。没有名为i
的内存位置。名称i
是通过与二进制文件一起加载的调试符号分配给该内存位置的(当用某些标志构建时),它维护“存储器位置”到“源代码级名称”Map。例如,PE文件格式提供了Debug目录,其中存储了有关调试符号的信息。这些在调试时非常有用,因为在没有此类调试符号的情况下,仅根据二进制0和1进行调试将是一项真正具有挑战性的任务。因此,当您调试此类二进制文件时(其具有上面的
i
的定义),其已经用调试标志构建,调试器通过PE文件中的调试目录知道存储器位置“0x10203040”对应于i
。crcmnpdw2#
呃,不。可执行文件包含机器码。以及全局变量的初始化值。在Windows上,调试信息通常存储在一个单独的文件中,一个. pdb。来自该文件的关于程序中的函数或变量的调试数据称为符号。
dbghelp API是described here。