Отображение памяти пользовательского процесса - всегда ли раздел bss имеет одинаковый размер? - PullRequest
4 голосов
/ 26 сентября 2011

Это может быть более старый запрос, но я пока не смог найти удовлетворительного ответа. Чтобы проверить карту памяти файла, я написал небольшую привет программу.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        printf("Hello\n");
        return 0;
}

Теперь после компиляции, когда я использую команду size в ее объектном файле, я получаю:

# size hello
   text    data     bss     dec     hex filename
   1133     492      16    1641     669 hello

Я проверил размер и для других файлов. Я всегда получаю bss как 16. Исправлен ли bss? Включено ли это в данные или нет? Я имею в виду это 16 входит в 492 или нет. Насколько я понимаю, bss - это неинициализированный сегмент данных.

Ответы [ 4 ]

4 голосов
/ 26 сентября 2011

Размер раздела BSS варьируется между программами.Он описывает объем данных, который инициализируется «нулевыми байтами».Нули на самом деле не сохраняются в объектном файле, но сохраняется размер раздела BSS.

Раздел данных содержит начальные значения всех структур данных, которые не инициализированы как «все байты ноль»;это также варьируется между программами.Он не включает пробел, включенный в раздел BSS.


Вы получили бы больший раздел BSS с такой программой:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

enum { A_SIZE = 100 };
static int a[A_SIZE];

int main(void)
{
    srand(time(0));
    for (int i = 0; i < A_SIZE; i++)
        a[i] = i;
    for (int i = A_SIZE; i > 0; i--)
    {
        int j = rand() % i;  // Not good random number generation!
        int t = a[j];
        a[j] = a[i-1];
        a[i-1] = t;
    }
    for (int i = 0; i < A_SIZE; i++)
        printf("%d\n", a[i]);
    return 0;
}

Код перетасовывает числа изОт 0 до 99, с некоторым смещением в генерации случайных чисел (так что это не идеальное перемешивание, но на самом деле это не главное для упражнения - это просто нетривиальный код, использующий статический массив, даже еслилокальной переменной будет достаточно).Когда я запускаю size (в Ubuntu 13.10), я получаю:

text       data     bss     dec     hex filename
1593        584     432    2609     a31 shuffle

Для сравнения в программе 'hello' в вопросе я получаю:

text       data     bss     dec     hex filename
1200        560       8    1768     6e8 hello

основное отличие состоит в том, что массив a занимает 400 байт;остальные 24 байта BSS принадлежат другому коду.

4 голосов
/ 26 сентября 2011

Хорошая статья в Википедии описывает, что такое .bss. Это сегмент, содержащий статически распределенные переменные. Таким образом, его размер включен в размер объектного файла и не является фиксированным.

3 голосов
/ 26 сентября 2011

Ваш запрос, связанный .bss уже был дан ответ; но если вы рассматриваете отображение памяти, которое, как представляется, является целевым для вашего оператора запроса, я могу предложить использовать утилиты, такие как readelf, objdump & nm вместо size для более подробной диагностики. Также вы можете изучить файлы карт для gcc, которые можно сгенерировать с помощью опций компоновщика -Wl,-M для консоли (стандартный вывод) или с помощью -Wl,-Map,<map_file_name>, которые обеспечивают сопоставление символов с помощью ld и глобального хранилища.
P.S: Очень хорошо отвеченный запрос, относящийся к .bss в SO: Занимают ли нулевые инициализированные переменные секции .bss место в файле elf?

2 голосов
/ 26 сентября 2011

BSS был бы больше, если бы вы имели, например, неинициализированный массив: Например, char bss[100];

По сути, каждая статическая переменная, которая не инициализируется, переходит в BSS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...