Сейчас на форуме: tyns777, bezumchik (+5 невидимых)

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

Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

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

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



Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

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

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



Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

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

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




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 07 сентября 2019 14:27
· Личное сообщение · #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.             }


-----
vx





Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

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

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

-----
2 оттенка серого





Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

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

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

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

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 16.3 (новичок), 2thx
Активность: 0.150.22
Статус: Участник

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

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



Ранг: -1.9 (гость), 3thx
Активность: 0.160.1
Статус: Участник

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

zombi-vadim а каково практическое применение данной информации, или чисто простой интерес, мне для общего развития, так сказать?


 eXeL@B —› Вопросы новичков —› Как правильно вычислить значение Misc.VirtualSize?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати