Составители:
Рубрика:
рия для операционной системы VAX/VMS, и у них уже были навыки и го-
товый код для работы с исполняемыми файлами, представленными в фор-
мате Common Object File Format (COFF). Соответственно, формат COFF в
слегка модифицированном виде был перенесен в Windows NT и получил
название PE.
В «.NET Framework Glossary» сказано, что PE – это реализация
Microsoft формата COFF. В то же время в [5] утверждается, что PE – это
формат исполняемых файлов, а COFF – это формат объектных файлов.
Вообще, мы можем наблюдать путаницу в документации Microsoft отно-
сительно названия формата. В некоторых местах они называют его COFF,
а в некоторых – PE. Правда, можно заметить, что в новых текстах назва-
ние COFF используется все меньше и меньше. Более того, формат PE по-
стоянно эволюционирует. Например, несколько лет назад в Microsoft от-
казались от хранения отладочной информации внутри исполняемого фай-
ла, и поэтому теперь многие поля в структурах формата COFF просто не
используются. Кроме того, формат COFF – 32-разрядный, а последняя
редакция формата PE (она называется PE32+) может использоваться на
64-разрядных аппаратных платформах. Поэтому, видимо, дело идет к тому,
что название COFF вообще перестанут использовать.
Интересно отметить, что исполняемые файлы в устаревших форма-
тах NE и LE до сих пор поддерживаются Windows. Исполняемые файлы в
формате NE можно запускать под управлением NTVDM (NT Virtual DOS
Machine), а формат LE используется для виртуальных драйверов устройств
(VxD).
Почему в названии формата PE присутствует слово «portable» («пе-
реносимый»)? Дело в том, что Windows NT была реализована не только
для платформы Intel x86, но и для платформ MIPS R4000, DEC Alpha и
PowerPC. И во всех реализациях для хранения исполняемых файлов ис-
пользовался формат PE. При этом речь не шла о достижении двоичной
совместимости между этими платформами, то есть exe-файл, предназна-
ченный для выполнения на платформе Intel x86, нельзя было запустить на
PowerPC. Важно понимать, что переносимость формата еще не означает
переносимость исполняемых файлов, записанных в этом формате. Фор-
мат PE переносим в том смысле, что он слабо зависит от типа процессо-
ра и поэтому подходит для разных платформ (в том числе и для платфор-
мы .NET).
Далее в этой главе мы не будем затрагивать 64-разрядный вариант
формата PE, потому что в настоящее время сборки .NET хранятся в преж-
нем 32-разрядном формате. Однако отметим, что 64-разрядный PE очень
слабо отличается от 32-разрядного. Основное отличие касается разрядно-
сти полей структур PE-файла.
Структура программных компонентов
33
Глава 2.
Структура программных компонентов
2.1. Формат исполняемых файлов
Исполняемый файл (executable file) – это файл, который может быть
загружен в память загрузчиком операционной системы и затем исполнен.
В операционной системе Windows исполняемые файлы, как правило, име-
ют расширения «.exe» и «.dll». Расширение «.exe» имеют программы, кото-
рые могут быть непосредственно запущены пользователем. Расширение
«.dll» имеют так называемые динамически связываемые библиотеки
(dynamic link libraries). Эти библиотеки экспортируют функции, использу-
емые другими программами.
Для того чтобы загрузчик операционной системы мог правильно за-
грузить исполняемый файл в память, содержимое этого файла должно со-
ответствовать принятому в данной операционной системе формату испол-
няемых файлов. В разных операционных системах в разное время сущест-
вовало и до сих пор существует множество различных форматов. В этой
главе мы рассмотрим формат Portable Executable (PE). Формат PE – это ос-
новной формат для хранения исполняемых файлов в операционной систе-
ме Windows. Сборки .NET тоже хранятся в этом формате.
Кроме того, формат PE может использоваться для представления
объектных файлов. Объектные файлы служат для организации раздельной
компиляции программы. Смысл раздельной компиляции заключается в
том, что части программы (модули) компилируются независимо в объект-
ные файлы, которые затем связываются компоновщиком в один исполня-
емый файл.
А теперь – немного истории. Формат PE был создан разработчиками
Windows NT. До этого в операционной системе Windows использовались
форматы New Executable (NE) и Linear Executable (LE) для представления
исполняемых файлов, а для хранения объектных файлов использовался
Object Module Format (OMF). Формат NE предназначался для 16-разряд-
ных приложений Windows, а формат LE, изначально разработанный для
OS/2, был уже 32-разрядным. Возникает вопрос: почему разработчики
Windows NT решили отказаться от существующих форматов? Ответ стано-
вится очевидным, если обратить внимание на то, что большая часть ко-
манды, работавшей над созданием Windows NT, ранее работала в Digital
Equipment Corporation. Они занимались в DEC разработкой инструмента-
32
CIL и системное программирование в Microsoft .NET
32 CIL и системное программирование в Microsoft .NET Структура программных компонентов 33 рия для операционной системы VAX/VMS, и у них уже были навыки и го- Глава 2. товый код для работы с исполняемыми файлами, представленными в фор- мате Common Object File Format (COFF). Соответственно, формат COFF в Структура программных компонентов слегка модифицированном виде был перенесен в Windows NT и получил название PE. В «.NET Framework Glossary» сказано, что PE – это реализация Microsoft формата COFF. В то же время в [5] утверждается, что PE – это 2.1. Формат исполняемых файлов формат исполняемых файлов, а COFF – это формат объектных файлов. Вообще, мы можем наблюдать путаницу в документации Microsoft отно- Исполняемый файл (executable file) – это файл, который может быть сительно названия формата. В некоторых местах они называют его COFF, загружен в память загрузчиком операционной системы и затем исполнен. а в некоторых – PE. Правда, можно заметить, что в новых текстах назва- В операционной системе Windows исполняемые файлы, как правило, име- ние COFF используется все меньше и меньше. Более того, формат PE по- ют расширения «.exe» и «.dll». Расширение «.exe» имеют программы, кото- стоянно эволюционирует. Например, несколько лет назад в Microsoft от- рые могут быть непосредственно запущены пользователем. Расширение казались от хранения отладочной информации внутри исполняемого фай- «.dll» имеют так называемые динамически связываемые библиотеки ла, и поэтому теперь многие поля в структурах формата COFF просто не (dynamic link libraries). Эти библиотеки экспортируют функции, использу- используются. Кроме того, формат COFF – 32-разрядный, а последняя емые другими программами. редакция формата PE (она называется PE32+) может использоваться на Для того чтобы загрузчик операционной системы мог правильно за- 64-разрядных аппаратных платформах. Поэтому, видимо, дело идет к тому, грузить исполняемый файл в память, содержимое этого файла должно со- что название COFF вообще перестанут использовать. ответствовать принятому в данной операционной системе формату испол- Интересно отметить, что исполняемые файлы в устаревших форма- няемых файлов. В разных операционных системах в разное время сущест- тах NE и LE до сих пор поддерживаются Windows. Исполняемые файлы в вовало и до сих пор существует множество различных форматов. В этой формате NE можно запускать под управлением NTVDM (NT Virtual DOS главе мы рассмотрим формат Portable Executable (PE). Формат PE – это ос- Machine), а формат LE используется для виртуальных драйверов устройств новной формат для хранения исполняемых файлов в операционной систе- (VxD). ме Windows. Сборки .NET тоже хранятся в этом формате. Почему в названии формата PE присутствует слово «portable» («пе- Кроме того, формат PE может использоваться для представления реносимый»)? Дело в том, что Windows NT была реализована не только объектных файлов. Объектные файлы служат для организации раздельной для платформы Intel x86, но и для платформ MIPS R4000, DEC Alpha и компиляции программы. Смысл раздельной компиляции заключается в PowerPC. И во всех реализациях для хранения исполняемых файлов ис- том, что части программы (модули) компилируются независимо в объект- пользовался формат PE. При этом речь не шла о достижении двоичной ные файлы, которые затем связываются компоновщиком в один исполня- совместимости между этими платформами, то есть exe-файл, предназна- емый файл. ченный для выполнения на платформе Intel x86, нельзя было запустить на А теперь – немного истории. Формат PE был создан разработчиками PowerPC. Важно понимать, что переносимость формата еще не означает Windows NT. До этого в операционной системе Windows использовались переносимость исполняемых файлов, записанных в этом формате. Фор- форматы New Executable (NE) и Linear Executable (LE) для представления мат PE переносим в том смысле, что он слабо зависит от типа процессо- исполняемых файлов, а для хранения объектных файлов использовался ра и поэтому подходит для разных платформ (в том числе и для платфор- Object Module Format (OMF). Формат NE предназначался для 16-разряд- мы .NET). ных приложений Windows, а формат LE, изначально разработанный для Далее в этой главе мы не будем затрагивать 64-разрядный вариант OS/2, был уже 32-разрядным. Возникает вопрос: почему разработчики формата PE, потому что в настоящее время сборки .NET хранятся в преж- Windows NT решили отказаться от существующих форматов? Ответ стано- нем 32-разрядном формате. Однако отметим, что 64-разрядный PE очень вится очевидным, если обратить внимание на то, что большая часть ко- слабо отличается от 32-разрядного. Основное отличие касается разрядно- манды, работавшей над созданием Windows NT, ранее работала в Digital сти полей структур PE-файла. Equipment Corporation. Они занимались в DEC разработкой инструмента-
Страницы
- « первая
- ‹ предыдущая
- …
- 21
- 22
- 23
- 24
- 25
- …
- следующая ›
- последняя »