eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 сентября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: dma (+7 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Вопросы новичков —› Как правильно вычислить значение Misc.VirtualSize?
Посл.ответ Сообщение

Ранг: 10.6 (новичок)
Статус: Участник

Создано: 7 сентября 2019 13:02 New!
Цитата · Личное сообщение · #1

Привет. Итак значение VirtualSize это размер секции в виртуальной памяти. Вроде понятно. Хорошо берем физический размер данных выравниваем на SectionAlignment и.. получаем неправильное значение.
Открываем файл в любом редакторе смотрим значения VirtualSize секций. Они практически всегда меньше SizeOfRawData, даже в файлах где SectionAlignment = FileAlignment. Получается что линкер не выравнивает значения, почему? В надежде что загрузчик их потом выровняет сам? Посмотрим к примеру секцию ресурсов. Вроде там точно все данные инициализированные. Но значение VirtualSize не совпадает ни с размером выровненных данных ни просто с размером данных. Что за значение линкер туда ставит то?

Ранг: 16.1 (новичок)
Статус: Участник

Создано: 7 сентября 2019 13:39 New!
Цитата · Личное сообщение · #2

Посмотрел бинарники скомпиленные в делфи и в с++, VirtSize меньше либо равно raw data size, при этом raw data size округлен до 0x100

Ранг: 10.6 (новичок)
Статус: Участник

Создано: 7 сентября 2019 14:13 New!
Цитата · Личное сообщение · #3

user99
SectionAlignment = FileAlignment. Однако VirtualSize меньше SizeOfRawData.
Делаем вывод значения VirtualSize не выравниваются.
VirtualSize содержит некий размер данных вычисленный линкером.Как он его получает?


Ранг: 302.0 (мудрец)
Статус: Участник

Создано: 7 сентября 2019 14:27 New!
Цитата · Личное сообщение · #4

zombi-vadim

Надёжнее всего посмотреть на сам загрузчик:
Code:
  1.         // Generally, SizeOfRawData is larger than VirtualSize for each
  2.         // section because it includes the padding to get to the subsection
  3.         // alignment boundary.  However, if the image is linked with
  4.         // subsection alignment == native page alignment, the linker will
  5.         // have VirtualSize be much larger than SizeOfRawData because it
  6.         // will account for all the bss.
  7.         //
  8.  
  9.         Span = SectionTableEntry->SizeOfRawData;
  10.  
  11.         if (Span < SectionTableEntry->Misc.VirtualSize) {
  12.             Span = SectionTableEntry->Misc.VirtualSize;
  13.         }

..
Code:
  1.             // Handle case where virtual size is 0.
  2.             //
  3.  
  4.             if (SectionTableEntry->Misc.VirtualSize == 0) {
  5.                 SectionVirtualSize = SectionTableEntry->SizeOfRawData;
  6.             }
  7.             else {
  8.                 SectionVirtualSize = SectionTableEntry->Misc.VirtualSize;
  9.             }
  10.  
  11.             //
  12.             // Fix for Borland linker problem.  The SizeOfRawData can
  13.             // be a zero, but the PointerToRawData is not zero.
  14.             // Set it to zero.
  15.             //
  16.  
  17.             if (SectionTableEntry->SizeOfRawData == 0) {
  18.                 SectionTableEntry->PointerToRawData = 0;
  19.             }


Ранг: 211.3 (наставник)
Статус: Участник

Создано: 7 сентября 2019 14:27 New!
Цитата · Личное сообщение · #5

В секции могут быть неинициализированные переменные. То есть те, в которые загрузчику ничего не надо помещать и в сам исполняемый файл они не входят. Разница между выравненным raw size и virtual size - пространство под неинициализированные глобальные переменные.


Ранг: 537.4 (!)
Статус: Участник
оптимист

Создано: 7 сентября 2019 14:38 New!
Цитата · Личное сообщение · #6

zombi-vadim пишет:
Что за значение линкер туда ставит то?

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

Ранг: 10.6 (новичок)
Статус: Участник

Создано: 7 сентября 2019 14:54 · Поправил: zombi-vadim New!
Цитата · Личное сообщение · #7

ClockManВ итоге получаем. VirtualSize содержит не выровненный размер. В нем ровно столько сколько необходимо для правильной работы программы. Ни к какому общему физическому размеру он отношения не имеет.

Ранг: -1.9 (нарушитель)
Статус: Участник

Создано: 8 сентября 2019 08:50 New!
Цитата · Личное сообщение · #8

zombi-vadim а каково практическое применение данной информации, или чисто простой интерес, мне для общего развития, так сказать?
 eXeL@B —› Вопросы новичков —› Как правильно вычислить значение Misc.VirtualSize?

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS