Какой раздел для неинициализированных глобальных данных? - PullRequest
2 голосов
/ 26 марта 2011

Я немного сбит с толку относительно того, где неинициализированные глобальные переменные находятся в файле ELF. У меня есть эта простая программа для проверки, в каких разделах будут расположены переменные:

const int a = 11;
int b = 10;
int c;

int main()
{
    return 0;
}

Я знаю, что неинициализированная глобальная переменная должна быть помещена в раздел .bss файла ELF, но objdump -h дает мне следующий вывод:

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000000a  00000000  00000000  00000034  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000004  00000000  00000000  00000040  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  00000000  00000000  00000044  2**2
                  ALLOC
  3 .rodata       00000004  00000000  00000000  00000044  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .comment      00000024  00000000  00000000  00000048  2**0
                  CONTENTS, READONLY
  5 .note.GNU-stack 00000000  00000000  00000000  0000006c  2**0
                  CONTENTS, READONLY

Значит, переменная a переходит в .rodata, b - в .data, а c - в никуда? Когда я изменяю код на:

int c = 0;

все как положено - секция .bss имеет длину 4, но что происходит с переменной c, когда она не инициализирована?

1 Ответ

1 голос
/ 26 марта 2011

Переходит в «общий раздел».Вы можете увидеть это с помощью objdump -t или с помощью nm.

Я не совсем уверен, что понимаю, о чем идет речь, но ссылка на флаг ld -warn-common говорит об этом:

int i;

Общий символ.Если для переменной есть только (один или несколько) общих символов, она помещается в область неинициализированных данных выходного файла.Компоновщик объединяет несколько общих символов для одной и той же переменной в один символ.Если они имеют разные размеры, он выбирает самый большой размер.Компоновщик превращает общий символ в объявление, если есть определение этой же переменной.

(найдено на справочной странице nm). После этого на справочной странице есть дополнительная информациясам по себе.

...