Может ли загрузчик двоичного файла заполнить область памяти? - PullRequest
0 голосов
/ 13 июня 2019

Я делаю некоторые тесты здесь на моей машине, и я понял, что, когда я не инициализирую переменную, ее значение имеет тенденцию быть 0, но это только инициализируется с 0, когда код компилируется в 64 бита, после некоторых тестов я убедился, что это загрузчик двоичного файла, который заполняет адрес памяти значением 0, а не компилятор. Я хотел бы подтвердить, если это действительно загрузчик, который устанавливает значение 0, благодарен

#include <stdio.h>

int x; //section .bss

int main(void) {
    printf("%d\n", x);
    return 0; 
}

1 Ответ

4 голосов
/ 13 июня 2019

Я провожу здесь некоторые тесты на своем компьютере, и я понял, что, когда я не инициализирую переменную, ее значение обычно равно 0,

Если переменная со статическимпродолжительность хранения (например, x) определяется без инициализатора, затем его начальное значение равно 0 (арифметические типы) или нулевому указателю (типы указателей), либо это агрегатный тип, и его члены инициализируются согласно этим правилам(рекурсивно) или это тип объединения, и его первый член инициализируется в соответствии с этими правилами.Это определено в параграфе 6.7.9 / 10 стандарта языка, поэтому в соответствующей соответствующей реализации "имеет тенденцию быть" слишком слабой.

Но обратите внимание, что это не относится кавтоматические переменные (объявленные в области блока и без спецификатора класса хранения).Если автоматическая переменная объявляется без инициализатора, то ее начальное значение является неопределенным, а если вы используете значение такого объекта без предварительной установки, то поведение не определено.Возможно, именно поэтому вы хеджировали.

, но он инициализируется только 0, когда код компилируется в 64 бита,

Если мы говорим о соответствующих реализацияхтогда размер слова целевой архитектуры не имеет к этому никакого отношения.

после некоторых тестов я убедился, что это загрузчик двоичного файла, который заполняет адрес памяти значением 0, а некомпилятор.

Это зависит от реализации.С не указывает.Однако вы пометили реализации ELF и C, которые нацелены на ELF, обычно назначают инициализированные по умолчанию объекты разделу BSS, который в значительной степени предназначен для этой цели.BSS не занимает места на диске, но при загрузке он инициализируется нулевыми битами.

Я хотел бы подтвердить, действительно ли это загрузчик, который устанавливает значение 0, благодарен

Загрузчик программы, в какой бы форме она ни находилась в любой конкретной реализации, устанавливает начальное значение каждой переменной со статической продолжительностью независимо от того, определено ли оно с помощью инициализатора.Это может быть сделано путем загрузки значения с диска или, в некоторых случаях, путем его заполнения нулями без загрузки определенного значения с диска или, возможно, с помощью какого-либо другого механизма.Как уже было описано, для переменных, назначенных разделу BSS объекта ELF, загрузчик (в данном случае динамический компоновщик) заполняет представление нулями.

...