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

UptoLike

рия для операционной системы 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 разработкой инструмента-