Справочная страница nm
Вот: MAN NM Говорит, что
Тип символа. По крайней мере, используются следующие типы; другие, как
ну, в зависимости от формата объектного файла. Если строчные, символ
обычно местный; в верхнем регистре символ является глобальным (внешним)
И под ним есть «b» и «B» для «раздела неинициализированных данных (известный как BSS)» и «d» и «D» для «раздела инициализированных данных»
Но я думал, что локальные переменные всегда идут в стек / кучу, а не в разделы «Данные» или «BSS». Тогда о каких локальных переменных говорит НМ?
«локальный» в данном контексте означает область файла.
То есть:
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; инициализированные данные попадают в раздел «Данные»; и постоянные данные, вероятно, идут в разделе текста.