1

昨天突然有一个疑问。我已经用 C 编程很长时间了。我的问题是这样的:

假设有一个变量

static uint32_t count = 0;

这个变量应该存储在数据段中。为了这个例子,我们假设数据段在0x08000000进程的4GB虚拟内存空间中的偏移处开始。

我知道在偏移量之后的某处,0x08000000为变量“count”保留了 4 个字节,值为 0。

我的问题是内存中的这个 4 字节值如何与名称“count”和类型“uint32_t”相关联(或者它是 4 字节长而不是 6 字节长的事实。)

从下面的答案看来,映射信息存储在"symbol table"

似乎表明它必须是内存中最终可执行文件的一部分。如果是这样,符号表存储在哪里?它在代码/文本段中吗?

4

3 回答 3

3

就生成的机器码而言,不存在名称“count”。它只知道加载和存储数据的地址。类似地,类型信息不会保留,因为生成用于操作此变量的机器代码是为了对正确的大小和符号进行操作,因此它执行 4 字节加载和存储,以及无符号的 32 位算术运算数据。

出于调试和动态链接的目的,该信息可能在其他地方可用。带有符号的二进制文件将有一个表格,其中列出了全局变量所在的地址或偏移量,以及它们的类型。

于 2013-02-07T18:46:16.590 回答
2

与名称的关联:或者可执行文件有一个符号表,它提供有关名称和相应地址的动态链接器信息(本质上是一个映射),或者如果可执行文件被剥离,则根本没有名称,只有原始地址被引用.

与类型的关联:只需编译器生成将该地址视为 4 字节无符号整数开头的代码(例如,在DWORDs 上操作的指令等)

于 2013-02-07T17:57:34.973 回答
1

当编译器解析您的代码时,它会保存数据结构,其中包含有关它在程序中看到的类型和变量的信息。所以,当解析器看到:

static uint32_t count = 0;

它记录了一个变量count,其类型uint32_t的静态存储持续时间初始化为零。当解析器再次遇到该标识符count时,它就知道它引用了前面提到的变量。所有这些信息都在生成目标代码时使用,因此编译器后端知道为其分配空间,并将其视为无符号整数。此信息可能最终出现在目标文件中,用于调试,或者如果它不是静态变量,它可能最终出现在动态链接器使用的部分中。

加载器不需要此信息,因此如果它仍然存在于目标文件中,则不需要加载它。链接器和动态链接器可能需要导出符号的信息,因此它们从适当的部分加载它。

于 2013-02-07T18:51:22.453 回答