这里的手册页nm
:MAN NM说
符号类型。至少使用以下类型;其他的也取决于目标文件格式。如果是小写,符号通常是本地的;如果是大写,则符号是全局的(外部的)
在它下面有“未初始化数据部分(称为 BSS)”的“b”和“B”以及“初始化数据部分”的“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 部分;初始化数据进入数据部分;并且常量数据可能位于文本部分。