Какие все локальные переменные переходят в сегмент данных / BSS?

Справочная страница nm Вот: MAN NM Говорит, что

Тип символа. По крайней мере, используются следующие типы; другие, как
ну, в зависимости от формата объектного файла. Если строчные, символ
обычно местный; в верхнем регистре символ является глобальным (внешним)

И под ним есть «b» и «B» для «раздела неинициализированных данных (известный как BSS)» и «d» и «D» для «раздела инициализированных данных»

Но я думал, что локальные переменные всегда идут в стек / кучу, а не в разделы «Данные» или «BSS». Тогда о каких локальных переменных говорит НМ?

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
}
3

Другие решения

Статические переменные области действия входят в разделы данных или 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; инициализированные данные попадают в раздел «Данные»; и постоянные данные, вероятно, идут в разделе текста.

0

По вопросам рекламы [email protected]