Составители:
Рубрика:
Заголовок начинается с сигнатуры «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».
Страницы
- « первая
- ‹ предыдущая
- …
- 25
- 26
- 27
- 28
- 29
- …
- следующая ›
- последняя »