2014-02-08 3 views
1

Недавно я узнал, что .data раздел в PE может иметь виртуальный размер больше, чем необработанный размер (в файле). Это довольно удивительно. Некоторые люди говорят, что это эффект неинициализированных данных где-то.Почему иногда виртуальный размер раздела .data больше размера необработанного?

Но после анализа некоторых PE я не могу найти эти дополнительные данные. Вот ссылка на результаты PEDump некоторой программы:

"Hello world" PEDump

Как вы можете видеть, .data секция имеет больший размер, чем виртуальный сырой размер. Почему так происходит в этом конкретном примере?

ответ

1

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

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

Если загрузчик не зарезервировал это место спереди, тогда глобальные блоки и т. Д. Должны были бы быть выделены на кучу до того, как они могут быть использованы.

От PE spec:

[SizeOfRawData есть] размер секции (для объектных файлов) или размера инициализированных данных на диске (для файлов изображений). Для исполняемых файлов это должно быть кратно FileAlignment из дополнительного заголовка . Если это меньше, чем VirtualSize, остальная часть раздела заполняется нулями. Поскольку поле SizeOfRawData округлено, но поле VirtualSize отсутствует, возможно, что SizeOfRawData будет больше, чем VirtualSize. Если в разделе содержится только неинициализированных данных, это поле должно быть равно нулю.


Edit: Ответ на вопрос о SizeOfUninitializedData.

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

+0

Хорошо, так что, если я понимаю ваш ответ, разница в размере неинициализированных данных, но, как вы можете видеть в приведенной ссылке, размер неинициализированных данных равен 0. – eclipse

+0

@eclipse, ответил ли ответ на ваш вопрос? –

+0

Все еще неясно :) так, вы имеете в виду, что мой раздел .data на самом деле .data + .bss? И что нам нужно зарезервировать для него виртуальную память, но поскольку она будет заполнена 0, мы выравниваем необработанный размер, как будто нет .bss? (Может быть, я просто сказал что-то ужасно неправильно :)) – eclipse