Я вижу, что для разделов в файлах изображений поле VirtualSize
представляет собой общий размер раздела при загрузке в память, а поле SizeOfRawData
- это размер инициализированных данных раздела на диске.PE: отношение между полями SizeOfRawData и VirtualSize заголовка раздела
При рассмотрении участка .idata
поле VirtualSize
было установлено равным 0x14, а поле SizeOfRawData
- 0x400.
Зачем нужен компоновщик - в этом случае MinGW ld
- сделать раздел файла таким большим, в то время как раздел, загруженный в память, является лишь его фракцией?
Кроме того, что является целью поля VirtualSize
? Почему бы не всегда загружать весь раздел, т. Е. Загружать байты SizeOfRawData
?
Я не вижу описания или их отношения в официальной документации PE.
Большое спасибо. Не всегда .data всегда содержит только инициализированные данные? Кроме того, где вы получаете "(VirtualSize + PAGE_SIZE - 1) & ~ (PAGE_SIZE-1)" от? Если это возможно, не могли бы вы указать мне на свой источник? Я хотел бы узнать больше на эту тему :-) – Shuzheng
@NicolasLykkeIversen размер раздела должен быть выровнен по размеру раздела (обычно это PAGE_SIZE (по умолчанию) - можно посмотреть здесь - MiCreateImageFileMap - http: //gate.upm. ро/OS/LAB,/Windows_OS_Internals_Curriculum_Resource_Kit-АКАДЕМИЧЕСКИЙ/WindowsResearchKernel-WRK/WRK-v1.2/основание/НТО/мм/creasect.c - MI_ROUND_TO_SIZE (LENGTH, ALIGNMENT) макрос – RbMm
Что делать, если раздел содержит как неинициализированные, так и инициализированные данные? Затем загрузчик копирует слишком много, потому что SizeOfRawData - 512? – Shuzheng