Составители:
Рубрика:
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
- …
- следующая ›
- последняя »
