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

UptoLike

Заголовок начинается с сигнатуры «MZ». Она представляет собой
инициалы одного из разработчиков операционной системы MS-DOS 2.0
Марка Збиковски и знаменита тем, что ни одна инструкция процессоров
семейства Intel x86 с нее не начинается. В свое время эта ее особенность
давала загрузчику исполняемых файлов MS-DOS возможность отличать
exe-файлы, которые появились только во второй версии MS-DOS, от com-
файлов.
Исполняемые com-файлы пришли в MS-DOS из операционной сис-
темы CP/M. Их формат был настолько примитивным, что вряд ли заслу-
живает того, чтобы вообще называться форматом исполняемых файлов.
Загрузчик должен был попросту загрузить com-файл в память, и после
нехитрых манипуляций, не вдаваясь в подробности внутренней структуры
файла, передать управление на его начало.
В принципе, PE-файл не обязан начинаться именно с такого заголов-
ка. Вы можете поместить в его начало любой exe-файл, работающий в MS-
DOS. При этом 32-разрядное слово, расположенное по смещению 0x3c в
этом exe-файле, должно содержать его размер. Для стандартного заголов-
ка это значение равно 0x00000080 (подчеркнуто в дампе).
Сразу после заголовка MS-DOS следует сигнатура PE-файла, состоя-
щая из четырех байт: 0x50, 0x45, 0x00 и 0x00 (в строковом представлении
она выглядит как «PE\0\0»). Поэтому при просмотре дампа PE-файла
очень просто понять, где заканчивается заголовок MS-DOS – достаточно
поискать глазами две буквы «PE».
Структура программных компонентов
41
дой импортируемой функции заносится в эту таблицу и в дальнейшем ис-
пользуется для вызова данной функции.
Секция «.idata» в сборках .NET в некотором смысле носит вспомога-
тельный характер, так как импортируемые сборкой динамические биб-
лиотеки описываются в метаданных. Задача этой секции – обеспечить за-
пуск среды выполнения .NET, поэтому в ней описывается только одна им-
портируемая из mscoree.dll функция (_CorExeMain для exe-файлов и
_CorDllMain – для dll-файлов). При запуске сборки .NET управление сразу
же передается этой функции, которая запускает Common Language
Runtime, осуществляющий JIT-компиляцию программы и контролирую-
щий в дальнейшем ее выполнение.
2.1.2.4. Экспорт функций
Экспорт функций из сборки .NET осуществляется достаточно редко.
Дело в том, что наличие метаданных в сборках позволяет нам экспортиро-
вать любые элементы сборки, такие как классы, методы, поля, свойства и
т.д. Таким образом, обычный механизм экспорта функций становится
ненужным.
Необходимость в экспорте функций возникает только тогда, когда
сборка .NET должна использоваться обычной программой Windows, код
которой не управляется средой выполнения .NET.
Информация об экспортируемых функциях хранится внутри PE-фай-
ла в специальной секции «.edata». При этом каждой функции присваивает-
ся уникальный номер, и с этим номером связывается RVA тела функции, и,
возможно, имя функции. Не всякая экспортируемая функция имеет имя,
так как имена служат, главным образом, для удобства программистов.
2.1.3. Заголовки
2.1.3.1. Заголовок MS-DOS
Каждый PE-файл начинается с небольшой (128 байт) программы, за-
писанной в формате исполняемых файлов MS-DOS. Эта программа выво-
дит на экран сообщение «This program cannot be run in DOS mode». В на-
стоящее время наличие такого «заголовка» вряд ли имеет смысл, но во
время повсеместного использования операционной системы MS-DOS
люди зачастую случайно пытались запускать PE-файлы из ДОСовской ко-
мандной строки, и эта маленькая программа в начале файла давала им воз-
можность осознать свою ошибку, выбросить MS-DOS на помойку и уста-
новить наконец-то Windows NT!
Рассмотрим шестнадцатеричный дамп заголовка MS-DOS, представ-
ленный на рис. 2.4.
40
CIL и системное программирование в Microsoft .NET
Рис. 2.4. Шестнадцатитеричный дамп заголовка MS-DOS
40                         CIL и системное программирование в Microsoft .NET   Структура программных компонентов                                     41


дой импортируемой функции заносится в эту таблицу и в дальнейшем ис-
пользуется для вызова данной функции.
     Секция «.idata» в сборках .NET в некотором смысле носит вспомога-
тельный характер, так как импортируемые сборкой динамические биб-
лиотеки описываются в метаданных. Задача этой секции – обеспечить за-
пуск среды выполнения .NET, поэтому в ней описывается только одна им-
портируемая из mscoree.dll функция (_CorExeMain для exe-файлов и
_CorDllMain – для dll-файлов). При запуске сборки .NET управление сразу
же передается этой функции, которая запускает Common Language
Runtime, осуществляющий JIT-компиляцию программы и контролирую-
щий в дальнейшем ее выполнение.

2.1.2.4. Экспорт функций
      Экспорт функций из сборки .NET осуществляется достаточно редко.
Дело в том, что наличие метаданных в сборках позволяет нам экспортиро-
вать любые элементы сборки, такие как классы, методы, поля, свойства и
т.д. Таким образом, обычный механизм экспорта функций становится
ненужным.                                                                           Рис. 2.4. Шестнадцатитеричный дамп заголовка MS-DOS
      Необходимость в экспорте функций возникает только тогда, когда
сборка .NET должна использоваться обычной программой Windows, код                   Заголовок начинается с сигнатуры «MZ». Она представляет собой
которой не управляется средой выполнения .NET.                                 инициалы одного из разработчиков операционной системы MS-DOS 2.0
      Информация об экспортируемых функциях хранится внутри PE-фай-            Марка Збиковски и знаменита тем, что ни одна инструкция процессоров
ла в специальной секции «.edata». При этом каждой функции присваивает-         семейства Intel x86 с нее не начинается. В свое время эта ее особенность
ся уникальный номер, и с этим номером связывается RVA тела функции, и,         давала загрузчику исполняемых файлов MS-DOS возможность отличать
возможно, имя функции. Не всякая экспортируемая функция имеет имя,             exe-файлы, которые появились только во второй версии MS-DOS, от com-
так как имена служат, главным образом, для удобства программистов.             файлов.
                                                                                    Исполняемые com-файлы пришли в MS-DOS из операционной сис-
2.1.3. Заголовки                                                               темы CP/M. Их формат был настолько примитивным, что вряд ли заслу-
                                                                               живает того, чтобы вообще называться форматом исполняемых файлов.
2.1.3.1. Заголовок MS-DOS                                                      Загрузчик должен был попросту загрузить com-файл в память, и после
     Каждый PE-файл начинается с небольшой (128 байт) программы, за-           нехитрых манипуляций, не вдаваясь в подробности внутренней структуры
писанной в формате исполняемых файлов MS-DOS. Эта программа выво-              файла, передать управление на его начало.
дит на экран сообщение «This program cannot be run in DOS mode». В на-              В принципе, PE-файл не обязан начинаться именно с такого заголов-
стоящее время наличие такого «заголовка» вряд ли имеет смысл, но во            ка. Вы можете поместить в его начало любой exe-файл, работающий в MS-
время повсеместного использования операционной системы MS-DOS                  DOS. При этом 32-разрядное слово, расположенное по смещению 0x3c в
люди зачастую случайно пытались запускать PE-файлы из ДОСовской ко-            этом exe-файле, должно содержать его размер. Для стандартного заголов-
мандной строки, и эта маленькая программа в начале файла давала им воз-        ка это значение равно 0x00000080 (подчеркнуто в дампе).
можность осознать свою ошибку, выбросить MS-DOS на помойку и уста-                  Сразу после заголовка MS-DOS следует сигнатура PE-файла, состоя-
новить наконец-то Windows NT!                                                  щая из четырех байт: 0x50, 0x45, 0x00 и 0x00 (в строковом представлении
     Рассмотрим шестнадцатеричный дамп заголовка MS-DOS, представ-             она выглядит как «PE\0\0»). Поэтому при просмотре дампа PE-файла
ленный на рис. 2.4.                                                            очень просто понять, где заканчивается заголовок MS-DOS – достаточно
                                                                               поискать глазами две буквы «PE».