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

UptoLike

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;
секции).                                                                                  Размер потока метаданных в байтах (должен быть кратен четырем).