Составители:
Рубрика:
Таблица 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; };
Страницы
- « первая
- ‹ предыдущая
- …
- 34
- 35
- 36
- 37
- 38
- …
- следующая ›
- последняя »