3

这里的手册页nmMAN NM

符号类型。至少使用以下类型;其他的也取决于目标文件格式。如果是小写,符号通常是本地的;如果是大写,则符号是全局的(外部的)

在它下面有“未初始化数据部分(称为 BSS)”的“b”和“B”以及“初始化数据部分”的“d”和“D”

但我认为局部变量总是转到堆栈/堆而不是“数据”或“BSS”部分。那么nm在说什么局部变量呢?

4

2 回答 2

3

在这种情况下,“本地”是指文件范围。

那是:

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
}
于 2015-06-15T06:05:15.487 回答
0

函数范围静态变量位于数据或 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 部分;初始化数据进入数据部分;并且常量数据可能位于文本部分。

于 2015-06-15T06:34:37.317 回答