【发布时间】:2015-06-15 05:49:22
【问题描述】:
nm 的手册页在这里:MAN NM 说
符号类型。至少使用以下类型;其他人是,如 好吧,取决于目标文件格式。如果是小写,则符号为 通常是本地的;如果是大写,则符号是全局(外部)
下面有“b”和“B”表示“未初始化的数据段(称为 BSS)”,“d”和“D”表示“初始化的数据段”
但我认为局部变量总是转到堆栈/堆而不是“数据”或“BSS”部分。那nm说的局部变量是什么?
【问题讨论】:
nm 的手册页在这里:MAN NM 说
符号类型。至少使用以下类型;其他人是,如 好吧,取决于目标文件格式。如果是小写,则符号为 通常是本地的;如果是大写,则符号是全局(外部)
下面有“b”和“B”表示“未初始化的数据段(称为 BSS)”,“d”和“D”表示“初始化的数据段”
但我认为局部变量总是转到堆栈/堆而不是“数据”或“BSS”部分。那nm说的局部变量是什么?
【问题讨论】:
在此上下文中的“本地”表示文件范围。
即:
static int local_data = 1; /* initialised local data */
static int local_bss; /* uninitialised local bss */
int global_data = 1; /* initialised global data */
int global_bss; /* uninitialised global bss */
void main (void)
{
// Some code
}
【讨论】:
函数范围静态变量位于数据或 BSS(或文本)部分,具体取决于初始化:
void somefunc(void)
{
static char array1[256] = ""; // Goes in BSS, probably
static char array2[256] = "ABCDEF…XYZ"; // Goes in Data
static const char string[] = "Kleptomanic Hypochondriac";
// Goes in Text, probably
…
}
类似的规则适用于在文件范围内定义的变量,无论是否带有static 存储类说明符——未初始化或零初始化的数据位于 BSS 部分;初始化数据进入数据部分;并且常量数据可能放在文本部分。
【讨论】: