Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 36 стр.

UptoLike

Таблица 2.1. Описание макросов
Код функции align:
#include <stdlib.h>
unsigned long align(unsigned long x, unsigned long alignment)
{
div_t t = div(x,alignment);
return t.rem == 0 ? x : (t.quot+1)*alignment;
};
Структура программных компонентов
59
На основе блока входных параметров вычисляется расположение
секций в памяти. Вычисления осуществляются внутри набора макросов
(см. таблицу 2.1).
58
CIL и системное программирование в Microsoft .NET
Рис. 2.6. Схематичное расположение секций и заголовков
Секция релокации
Таблица секций
Дополнительный заголовок PE
Заголовок PE
Заголовок MS-DOS
Секция .cli
Таблицы для импорта mscoree.dll
Заголовок CLI
Секция .text
Тела методов
Метаданные
Точка входа (jmp _CorExeMain)
RVA
RVA_OF_TEXT
RVA_OF_CLI
RVA_OF_RELOC
Макрос:
RVA_OF_TEXT
Описание:
RVA секции «.text»
Подстановка:
align(sizeof(struct HEADERS), SECTION_ALIGNMENT)
Код функции align приведен в конце таблицы.
align – округляет первый аргумент в большую сторону до числа, кратно-
го значению SECTION_ALIGNMENT.
SECTION_ALIGNMENT – фиксированное выравнивание секций 0x2000
Макрос:
RVA_OF_CLI(params)
Описание:
RVA секции «.cli». Принимает в качестве аргумента блок входных пара-
метров (INPUT_PARAMETERS)
Подстановка:
RVA_OF_TEXT +
align(params->SizeOfMetadata, SECTION_ALIGNMENT)
Макрос:
RVA_OF_RELOC(params)
Описание:
RVA секции «.reloc». Принимает в качестве аргумента блок входных па-
раметров (INPUT_PARAMETERS)
Подстановка:
RVA_OF_CLI(params) + SIZEOF_CLI_M
В свою очередь макрос SIZEOF_CLI_M определен как:
align(sizeof(struct CLI_SECTION_IMAGE), SECTION_ALIGNMENT)
Формат и назначение структуры CLI_SECTION_IMAGE описан в 2.1.6.3.
58                          CIL и системное программирование в Microsoft .NET               Структура программных компонентов                                    59


                                                                                                 Таблица 2.1. Описание макросов
                   Секция релокации
                                                                                            Макрос:
                                                                                            RVA_OF_TEXT
                       Секция .cli                                                          Описание:
                                                                                            RVA секции «.text»
             Таблицы для импорта mscoree.dll                                                Подстановка:
                                                                                            align(sizeof(struct HEADERS), SECTION_ALIGNMENT)
                                                                                            Код функции align приведен в конце таблицы.
                      Заголовок CLI
                                                                                            align – округляет первый аргумент в большую сторону до числа, кратно-
                                                                                            го значению SECTION_ALIGNMENT.
              Точка входа (jmp _CorExeMain)                                                 SECTION_ALIGNMENT – фиксированное выравнивание секций 0x2000

                                                                                            Макрос:
                      Секция .text                                                          RVA_OF_CLI(params)
                                                                                            Описание:
                      Тела методов                                                          RVA секции «.cli». Принимает в качестве аргумента блок входных пара-
                                                                                            метров (INPUT_PARAMETERS)
                                                                                            Подстановка:




                                                                             RVA_OF_RELOC
                      Метаданные
                                                                                            RVA_OF_TEXT +
                                                                                               align(params->SizeOfMetadata, SECTION_ALIGNMENT)

                     Таблица секций                                                         Макрос:




                                                                RVA_OF_CLI
                                                                                            RVA_OF_RELOC(params)
              Дополнительный заголовок PE                                                   Описание:




     RVA
                                                                                            RVA секции «.reloc». Принимает в качестве аргумента блок входных па-
                                                                                            раметров (INPUT_PARAMETERS)
                      Заголовок PE




                                                  RVA_OF_TEXT
                                                                                            Подстановка:
                                                                                            RVA_OF_CLI(params) + SIZEOF_CLI_M
                    Заголовок MS-DOS                                                        В свою очередь макрос SIZEOF_CLI_M определен как:
                                                                                            align(sizeof(struct CLI_SECTION_IMAGE), SECTION_ALIGNMENT)
     Рис. 2.6. Схематичное расположение секций и заголовков                                 Формат и назначение структуры CLI_SECTION_IMAGE описан в 2.1.6.3.
      На основе блока входных параметров вычисляется расположение                                Код функции align:
секций в памяти. Вычисления осуществляются внутри набора макросов                                #include 
(см. таблицу 2.1).                                                                               unsigned long align(unsigned long x, unsigned long alignment)
                                                                                                 {
                                                                                                    div_t t = div(x,alignment);
                                                                                                    return t.rem == 0 ? x : (t.quot+1)*alignment;
                                                                                                 };