IMAGE_OPTIONAL_HEADER.SizeOfInitializedData, не могу подсчитать.

Тема в разделе "WASM.WIN32", создана пользователем djmans, 15 ноя 2008.

  1. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    Много раз почитал msdn, и http://www.wasm.ru/article.php?article=green2red02 , поглядел кучу файлов разных компиляторов.. Мне не удалось повторить данное число правильно для этих же файлов.

    Естественно пресчитывал секции с атрибутом IMAGE_SCN_CNT_INITIALIZED_DATA. Пока тупулю с суммой VirtualSize, выравниваю по FileAligment. Получается что то близкое... Что еше нужно туда добавить?

    Или если не понятно, что я написал выше, вопрос следующий "Как подсчитать IMAGE_OPTIONAL_HEADER.SizeOfInitializedData?"

    Спасибо.
     
  2. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    VirtualSize выравнивается на SectionAligment.
     
  3. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    VS2008 сейчас установил нам это поле как сумму raw size всех секций, кроме секции кода. Но SizeOfInitializedData фактически нигде не используется же, можно и ноль выставить...
     
  4. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    Хорошо.

    файл notepad++.exe 5.0.3

    я считаю
    по VirualSize = 718E4h и того 72000h
    по RawSize = 66000h

    откуда линкер берет 73000?

    Код (Text):
    1. FILE HEADER VALUES
    2.              14C machine (x86)
    3.                4 number of sections
    4.         4895C3FF time date stamp Sun Aug 03 18:43:11 2008
    5.                0 file pointer to symbol table
    6.                0 number of symbols
    7.               E0 size of optional header
    8.              103 characteristics
    9.                    Relocations stripped
    10.                    Executable
    11.                    32 bit word machine
    12.  
    13. OPTIONAL HEADER VALUES
    14.              10B magic # (PE32)
    15.             8.00 linker version
    16.            74000 size of code
    17.            73000 size of initialized data
    18.                0 size of uninitialized data
    19.            5FF14 entry point (0045FF14)
    20.             1000 base of code
    21.            75000 base of data
    22.           400000 image base (00400000 to 004E7FFF)
    23.             1000 section alignment
    24.             1000 file alignment
    25.             4.00 operating system version
    26.             1.00 image version
    27.             4.00 subsystem version
    28.                0 Win32 version
    29.            E8000 size of image
    30.             1000 size of headers
    31.                0 checksum
    32.                2 subsystem (Windows GUI)
    33.                0 DLL characteristics
    34.           100000 size of stack reserve
    35.             1000 size of stack commit
    36.           100000 size of heap reserve
    37.             1000 size of heap commit
    38.                0 loader flags
    39.               10 number of directories
    40.                0 [       0] RVA [size] of Export Directory
    41.            8610C [      C8] RVA [size] of Import Directory
    42.            9B000 [   4CAE0] RVA [size] of Resource Directory
    43.                0 [       0] RVA [size] of Exception Directory
    44.                0 [       0] RVA [size] of Certificates Directory
    45.                0 [       0] RVA [size] of Base Relocation Directory
    46.                0 [       0] RVA [size] of Debug Directory
    47.                0 [       0] RVA [size] of Architecture Directory
    48.                0 [       0] RVA [size] of Global Pointer Directory
    49.                0 [       0] RVA [size] of Thread Storage Directory
    50.            7CD48 [      40] RVA [size] of Load Configuration Directory
    51.                0 [       0] RVA [size] of Bound Import Directory
    52.            75000 [     5FC] RVA [size] of Import Address Table Directory
    53.                0 [       0] RVA [size] of Delay Import Directory
    54.                0 [       0] RVA [size] of COM Descriptor Directory
    55.                0 [       0] RVA [size] of Reserved Directory
    56.  
    57.  
    58. SECTION HEADER #1
    59.    .text name
    60.    730C9 virtual size
    61.     1000 virtual address (00401000 to 004740C8)
    62.    74000 size of raw data
    63.     1000 file pointer to raw data (00001000 to 00074FFF)
    64.        0 file pointer to relocation table
    65.        0 file pointer to line numbers
    66.        0 number of relocations
    67.        0 number of line numbers
    68. 60000020 flags
    69.          Code
    70.          Execute Read
    71.  
    72. SECTION HEADER #2
    73.   .rdata name
    74.    13130 virtual size
    75.    75000 virtual address (00475000 to 0048812F)
    76.    14000 size of raw data
    77.    75000 file pointer to raw data (00075000 to 00088FFF)
    78.        0 file pointer to relocation table
    79.        0 file pointer to line numbers
    80.        0 number of relocations
    81.        0 number of line numbers
    82. 40000040 flags
    83.          Initialized Data
    84.          Read Only
    85.  
    86. SECTION HEADER #3
    87.    .data name
    88.    11CD4 virtual size
    89.    89000 virtual address (00489000 to 0049ACD3)
    90.     5000 size of raw data
    91.    89000 file pointer to raw data (00089000 to 0008DFFF)
    92.        0 file pointer to relocation table
    93.        0 file pointer to line numbers
    94.        0 number of relocations
    95.        0 number of line numbers
    96. C0000040 flags
    97.          Initialized Data
    98.          Read Write
    99.  
    100. SECTION HEADER #4
    101.    .rsrc name
    102.    4CAE0 virtual size
    103.    9B000 virtual address (0049B000 to 004E7ADF)
    104.    4D000 size of raw data
    105.    8E000 file pointer to raw data (0008E000 to 000DAFFF)
    106.        0 file pointer to relocation table
    107.        0 file pointer to line numbers
    108.        0 number of relocations
    109.        0 number of line numbers
    110. 40000040 flags
    111.          Initialized Data
    112.          Read Only
     
  5. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Это поле вообще как-то чем-то используется?
    Вроде бы нет %)
     
  6. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    нет, не используется, но мне нужно польностью эмулировать ms linker. и узнать как он его считает.
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    djmans
    Вообще-то выравнивается каждая секция, а не куча вместе, как попало. Поэтому:
    14000 + 12000 + 4D000 = 73000
     
  8. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Сейчас смотрели код линкера, наткнулись на процедуру посчёта размера данных и вспомнили про эту тему. В общем-то, скорее всего это уже не нужно, но пусть будет: упрощённый псевдокод вычисления размера данных в линкере из студии 2008 sp1.

    Код (Text):
    1. Для каждой конечной секции, включаемой в модуль:
    2.     TmpFlags = SectionFlags & (IMAGE_SCN_CNT_CODE | IMAGE_SCN_CNT_INITIALIZED_DATA |
    3.         IMAGE_SCN_CNT_UNINITIALIZED_ DATA | IMAGE_SCN_LNK_OTHER);  // 0x1E0
    4.  
    5.     if (TmpFlags == IMAGE_SCN_CNT_CODE)
    6.         SizeOfCode += ALIGNUP(VirtualSize, FileAlignment);
    7.     else if (TmpFlags == IMAGE_SCN_CNT_INITIALIZED_DATA)
    8.         if (эта секция - не ".debug" секция)
    9.             SizeOfInitializedData += ALIGNUP(VirtualSize, FileAlignment);
    10.     else if (TmpFlags == IMAGE_SCN_CNT_UNINITIALIZED_ DATA)
    11.         SizeOfUninitializedData += ALIGNUP(VirtualSize, FileAlignment);
    12.  
    13.     if (эта секция - не ".debug" секция)
    14.         ImageSize += ALIGNUP(ALIGNUP(VirtualSize, FileAlignment), SectionAlignment);