Где неинициализированные Глобальные переменные следуют за инициализацией?

Я забыл о технологии GNOME "apport", но я не знаю много об использовании его. Это используется для генерации stacktraces и другой диагностики для обработки и может автоматически зарегистрировать ошибки. К этому, конечно, стоит зарегистрироваться.

8
задан Patrick 11 August 2009 в 13:27
поделиться

4 ответа

Когда ОС загружает вашу программу, она выделяет достаточно памяти из адресного пространства вашей программы для хранения всего в разделе .bss и обнуляет всю эту память. Когда вы назначаете, читаете или принимаете адрес переменной, вы манипулируете той памятью, которая была выделена для обеспечения хранилища для раздела .bss.

8
ответ дан 5 December 2019 в 14:05
поделиться

BSS - это заполнитель, определенный в вашем исполняемом (или ELF) формате. Таким образом, он не занимает дисковое пространство, а только указывает, какая область памяти должна быть выделена компоновщиком или загрузчиком.

Точная операция зависит от операционной системы. Поскольку вы ссылаетесь на ELF, я предполагаю, что он предназначен для использования во встроенной системе. Если вы строите для ROMmable кода, ваш командный файл компоновщика сопоставит BSS с областью статического адреса.

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

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

Если вы используете значения BSS или нет, адрес останется прежним. то же самое для выполняемого вами процесса.

в котором он сопоставляет все ячейки, помеченные как относительные в формате excecutable, с физическими или логическими ячейками в памяти.

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

Если вы используете значения BSS или нет, адрес останется прежним. то же самое для выполняемого вами процесса.

в котором он сопоставляет все ячейки, помеченные как относительные в формате excecutable, с физическими или логическими ячейками в памяти.

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

Независимо от того, используете ли вы значения BSS, адрес останется прежним. то же самое для выполняемого вами процесса.

1
ответ дан 5 December 2019 в 14:05
поделиться

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

1
ответ дан 5 December 2019 в 14:05
поделиться

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

2
ответ дан 5 December 2019 в 14:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: