Составители:
Рубрика:
2.2.2. Структура метаданных
На рисунке 2.8 представлена схема структуры метаданных. Метадан-
ные начинаются с заголовка, называемого корнем метаданных (metadata
root). Корень метаданных начинается с 32-разрядной сигнатуры
0x424A5342. Если каждый байт сигнатуры рассматривать в виде ASCII-ко-
да, то получится строка «BSJB», составленная из начальных букв имен че-
тырех основных разработчиков .NET Framework: Брайана Харри (Brian
Harry), Сьюзан Радке-Спроулл (Susan Radke-Sproull), Джейсона Зандера
(Jason Zander) и Билла Эванса (Bill Evans). Далее в корне метаданных сле-
дует информация, относящаяся к версии .NET, а заканчивается корень ме-
таданных 16-разрядным целым числом, содержащим количество так на-
зываемых потоков метаданных, заголовки которых располагаются непо-
средственно после корня метаданных.
Потоки метаданных (metadata streams) предназначены для хранения
определенных видов информации. Заголовок каждого потока метаданных
представляет собой структуру, состоящую из трех полей:
long Offset;
Смещение потока метаданных относительно начала метаданных
в файле (то есть относительно начала корня метаданных).
long Size;
Размер потока метаданных в байтах (должен быть кратен четырем).
Структура программных компонентов
67
Рис. 2.7. Размещение данных внутри исполняемого файла для
учебного примера
На схеме видно, что в начале секции «.text» располагается тело метода
hello, за которым следуют метаданные. Напомним, что расположение ме-
таданных задается в заголовке CLI, который мы рассматривали в предыду-
щем разделе данной главы. Тем самым, мы вольны выбрать для метаданных
практически любое место внутри секции, и их расположение, изображен-
ное на схеме, является лишь одним из многих возможных вариантов.
Заметим, что метаданные и CIL-код практически не зависят от ос-
тальных элементов формата исполняемого файла. Они занимают часть
сборки .NET, при этом заголовок CLI указывает на метаданные, а внутри
метаданных хранятся RVA тел методов. Тело метода hello в нашем приме-
ре расположено в самом начале секции исключительно для того, чтобы
облегчить вычисление RVA этого метода (RVA метода совпадает с RVA
секции).
66
CIL и системное программирование в Microsoft .NET
Секция .reloc
Таблица секций
Дополнительный заголовок PE-файла
Заголовок PE-файла
Заголовок MS-DOS
Секция .text
Таблицы для импорта из mscoree.dll
Точка входа (jmp_CorExeMain)
Заголовок CLI
Метаданные
Тело метода hello
Таблицы метаданных
GUID heap (#GUID)
User String heap (#US)
String heap (#Strings)
Blob heap (#Blob)
Заголовки потоков метаданных
Корень метаданных
Потоки метаданных
/* Для каждого потока */
struct StreamHeader
{
long Offset;
long Size;
char Name [x];
}
struct MetadataRoot
{
long Signature;
/* 0x424A5342 */
...
unsigned short
Streams;
}
Рис. 2.8. Структура метаданных
66 CIL и системное программирование в Microsoft .NET Структура программных компонентов 67 2.2.2. Структура метаданных Секция .reloc На рисунке 2.8 представлена схема структуры метаданных. Метадан- ные начинаются с заголовка, называемого корнем метаданных (metadata Секция .text root). Корень метаданных начинается с 32-разрядной сигнатуры 0x424A5342. Если каждый байт сигнатуры рассматривать в виде ASCII-ко- Таблицы для импорта из mscoree.dll да, то получится строка «BSJB», составленная из начальных букв имен че- Точка входа (jmp_CorExeMain) тырех основных разработчиков .NET Framework: Брайана Харри (Brian Заголовок CLI Harry), Сьюзан Радке-Спроулл (Susan Radke-Sproull), Джейсона Зандера (Jason Zander) и Билла Эванса (Bill Evans). Далее в корне метаданных сле- дует информация, относящаяся к версии .NET, а заканчивается корень ме- Метаданные таданных 16-разрядным целым числом, содержащим количество так на- зываемых потоков метаданных, заголовки которых располагаются непо- Тело метода hello средственно после корня метаданных. /* Для каждого потока */ Таблица секций Таблицы метаданных struct StreamHeader { long Offset; Дополнительный заголовок PE-файла long Size; GUID heap (#GUID) char Name [x]; Заголовок PE-файла } User String heap (#US) Заголовок MS-DOS Потоки метаданных String heap (#Strings) struct MetadataRoot Blob heap (#Blob) { Рис. 2.7. Размещение данных внутри исполняемого файла для long Signature; учебного примера /* 0x424A5342 */ Заголовки потоков метаданных ... unsigned short На схеме видно, что в начале секции «.text» располагается тело метода Корень метаданных Streams; hello, за которым следуют метаданные. Напомним, что расположение ме- } таданных задается в заголовке CLI, который мы рассматривали в предыду- щем разделе данной главы. Тем самым, мы вольны выбрать для метаданных Рис. 2.8. Структура метаданных практически любое место внутри секции, и их расположение, изображен- ное на схеме, является лишь одним из многих возможных вариантов. Потоки метаданных (metadata streams) предназначены для хранения Заметим, что метаданные и CIL-код практически не зависят от ос- определенных видов информации. Заголовок каждого потока метаданных тальных элементов формата исполняемого файла. Они занимают часть представляет собой структуру, состоящую из трех полей: сборки .NET, при этом заголовок CLI указывает на метаданные, а внутри long Offset; метаданных хранятся RVA тел методов. Тело метода hello в нашем приме- Смещение потока метаданных относительно начала метаданных ре расположено в самом начале секции исключительно для того, чтобы в файле (то есть относительно начала корня метаданных). облегчить вычисление RVA этого метода (RVA метода совпадает с RVA long Size; секции). Размер потока метаданных в байтах (должен быть кратен четырем).
Страницы
- « первая
- ‹ предыдущая
- …
- 38
- 39
- 40
- 41
- 42
- …
- следующая ›
- последняя »