Portable Executable

Поделись знанием:
Перейти к: навигация, поиск
Переносимый исполняемый файл
Тип формата

двоичный, исполняемый, объектный, динамическая библиотека

Portable Executable (PE, «переносимый исполняемый») — формат исполняемых файлов, объектного кода и динамических библиотек, используемый в 32- и 64-разрядных версиях операционной системы Microsoft Windows. Формат PE представляет собой структуру данных, содержащую всю информацию, необходимую PE-загрузчику для отображения файла в память. Исполняемый код включает в себя ссылки для связывания динамически загружаемых библиотек, таблицы экспорта и импорта API функций, данные для управления ресурсами и данные локальной памяти потока (TLS). В операционных системах семейства Windows NT формат PE используется для EXE, DLL, SYS (драйверов устройств) и других типов исполняемых файлов.

PE представляет собой модифицированную версию COFF формата файла для Unix. PE/COFF — альтернативный термин при разработке Windows.

На операционных системах семейства Windows NT формат PE в настоящее время поддерживает следующие архитектуры наборов команд: IA-32, IA-64, и x86-64 (AMD64/Intel64). До Windows 2000 Windows NT (таким образом, и PE) поддерживал MIPS, Alpha, и PowerPC. Поскольку PE используется на Windows CE, он продолжает поддерживать несколько разновидностей MIPS, ARM (включая Thumb), и SuperH.

Основные «конкуренты» PE — ELF (используемый в Linux и большинстве других версий Unix) и Mach-O (используемый в Mac OS X).





Краткая история

С появлением операционной системы Windows NT 3.1 Microsoft перешла на формат PE. Все более поздние версии Windows, включая Windows 95/98/ME, поддерживают этот формат. Формат сохранил ограниченную поддержку существующего (MZ) для преодоления разрыва между системами, основанными на DOS, и системами NT. Например, заголовки PE/COFF всё ещё включают исполняемую программу MS-DOS, которая по умолчанию является заглушкой, выводящей на экран простое сообщение "This program cannot be run in DOS mode" — «Эта программа не может быть выполнена в режиме DOS» (или подобное). PE продолжает служить изменяющейся платформе Windows. Некоторые расширения включают формат PE.NET (см. ниже), 64-разрядную версию под названием PE32+ (иногда PE+), и спецификацию для Windows CE.

Технические детали

Сигнатура

Первые 2 байта PE файла содержат сигнатуру 0x4D 0x5A — «MZ» (как наследник MZ-формата). Далее двойное слово по смещению 0x3C содержит адрес PE-заголовка. Последний начинается с сигнатуры 0x50 0x45 — «PE».

Структура

Файл PE состоит из нескольких заголовков и секций, которые указывают динамическому компоновщику, как отображать файл в память. Исполняемый образ состоит из нескольких различных областей (секций), каждая из которых требует различных прав доступа к памяти; таким образом, начало каждой секции должно быть выровнено по границе страницы. Например, обычно секция .text, которая содержит код программы, отображена как исполняемая/доступная только для чтения, а секция .data, содержащая глобальные переменные, отображена как неисполняемая/доступная для чтения и записи. Однако, чтобы не тратить впустую пространство на жёстком диске, различные секции на нём на границу страницы не выровнены. Часть работы динамического компоновщика состоит в том, чтобы отобразить каждую секцию в память отдельно и присвоить корректные права доступа получившимся областям согласно указаниям, содержащимся в заголовках.

Таблица импорта

Одна из известных секций — таблица адресов импорта (IAT — Import Address Table), которая используется в качестве таблицы поиска, когда приложение вызывает функцию из другого модуля. Это может быть сделано и в форме импорта по порядковому номеру функции (ordinal), и импорта по её имени. Поскольку скомпилированной программе неизвестно расположение библиотек, от которых она зависит, то требуется производить косвенный переход всякий раз, когда происходит вызов API-функции. Когда динамический компоновщик загружает модули и объединяет их, он записывает действительные адреса в область IAT так, чтобы они указали на ячейки памяти соответствующих библиотечных функций. Хотя это добавляет дополнительный переход внутри модуля, приводящий к потере производительности, это предоставляет ключевое преимущество: количество страниц памяти, которые должны быть скопированы загрузчиком при записи, минимизировано, что приводит к экономии памяти и дискового времени ввода-вывода. Если компилятору будет известно заранее, что вызов будет межмодульным (через атрибут dllimport), то он сможет произвести более оптимизированный код, который просто приводит к коду операции косвенного вызова.

Таблица экспорта

Таблица адресов экспорта (EAT — Export Address Table) нужна для того, чтобы один модуль (обычно это динамически загружаемая библиотека) мог указать другим модулям, какие функции они могут из него импортировать, и по каким адресам последние расположены.

Таблица перемещений

Файлы PE не содержат позиционно-независимого кода. Вместо этого они скомпилированы для предпочтительного базового адреса, и все адреса, генерируемые компилятором/компоновщиком, заранее фиксированы. Если PE-файл не может быть загружен по своему предпочтительному адресу (потому что он уже занят чем-то ещё), операционная система будет перебазировать его. Это включает в себя перевычисление каждого абсолютного адреса и изменение кода для того, чтобы использовать новые значения. Загрузчик делает это, сравнивая предпочтительный и фактический адреса загрузки, и вычисляя значение разности. Тогда для получения нового адреса ячейки памяти эта разность складывается с предпочтительным адресом. Базовые адреса перемещений хранятся в списке и при необходимости добавляются к существующей ячейке памяти. Полученный код является теперь отдельным по отношению к процессу и не является больше разделяемым, так что при таком способе теряются многие из преимуществ экономии памяти динамически загружаемых библиотек. Такой способ также значительно замедляет загрузку модуля. По этой причине следует избегать перебазирования везде, где это возможно; например, библиотеки, поставляемые Microsoft, имеют предварительно вычисленные неперекрывающиеся базовые адреса. В случае отсутствия необходимости перебазировании PE-файлы имеют преимущество очень эффективного кода, но при наличии перебазирования издержки в использовании памяти могут быть значительными. Это отличает формат PE от ELF, который использует полностью позиционно-независимый код и глобальную таблицу смещений, которая жертвует временем выполнения в пользу расходования памяти.

.NET, метаданные, и PE формат

Платформа .NET корпорации Microsoft расширила формат PE с помощью функций, которые поддерживают общеязыковую среду исполнения (Common Language Runtime — CLR). Среди дополнений — заголовок CLR и секция данных CLR. После загрузки двоичного файла загрузчик ОС приводит к выполнению CLR через ссылку в таблице импорта PE/COFF. Затем CLR загружает заголовок CLR и секции данных.

Секция данных CLR содержит два важных сегмента: сегмент метаданных и сегмент кода промежуточного языка (IL):

  • Метаданные содержат информацию, относящуюся к сборке, включая манифест сборки. Манифест подробно описывает сборку, включая уникальный идентификатор (с помощью хеша, номера версии, и т. д.), данные об экспортируемых компонентах, расширенную информацию о типе (поддерживаемую общей системой типов (Common Type System — CTS)), внешние ссылки, и список файлов в сборке. Среда CLR широко использует метаданные.
  • Код промежуточного языка (Intermediate Language — IL) — абстрактный, независимый от языка код, который удовлетворяет требованиям общего промежуточного языка (Common Intermediate Language — CIL) .NET CLR . Термин «промежуточный» относится к природе кода IL, обладающего межъязыковой и кроссплатформенной совместимостью. Этот промежуточный язык, подобный байт-коду Java, позволяет платформам и языкам поддерживать общую среду .NET CLR. IL поддерживает объектно-ориентированное программирование (полиморфизм, наследование, абстрактные типы, и т. д.), исключения, события, и различные структуры данных.

Использование в других операционных системах

Формат PE также используется ReactOS, поскольку ReactOS предназначена для того, чтобы быть двоично совместимой с Windows на уровне кода. Кроме того, он исторически использовался многими другими операционными системами, включая SkyOS и BeOS R3. Однако и SkyOS, и BeOS в конечном счёте перешли на формат ELF.

Поскольку платформа разработки Mono намеревается быть двоично совместимой с Microsoft .NET, она использует тот же формат PE, что и в реализации Microsoft.

На платформе x86 в Unix-подобных операционных системах некоторые двоичные файлы Windows (в формате PE) могут быть выполнены с помощью Wine. HX DOS Extender также использует формат PE для собственных 32-разрядных двоичных файлов DOS, кроме того, может в некоторой степени выполнить существующие двоичные файлы Windows в DOS, действуя, таким образом, как Wine для DOS.

Mac OS X 10.5 имеет возможность загружать и интерпретировать PE-файлы, однако они не являются двоично совместимыми с Windows.

См. также

Напишите отзыв о статье "Portable Executable"

Примечания

Ссылки

  • [www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx Спецификация формата PE на веб-сайте Microsoft]  (англ.)
  • [msdn.microsoft.com/en-us/library/ms809762.aspx Что к чему внутри у PE: Экскурс по Win32 Portable Executable File Format]  (англ.)
  • [msdn.microsoft.com/ru-ru/magazine/bb985992(en-us).aspx Пристальный взгляд вовнутрь Win32 Portable Executable File Format]  (англ.)
  • [msdn.microsoft.com/ru-ru/magazine/bb985994(en-us).aspx Пристальный взгляд вовнутрь Win32 Portable Executable File Format, Часть 2]  (англ.)

Отрывок, характеризующий Portable Executable

Даву взглянул на него молча, и некоторое волнение и смущение, выразившиеся на лице Балашева, видимо, доставили ему удовольствие.
– Вам будет оказано должное, – сказал он и, положив конверт в карман, вышел из сарая.
Через минуту вошел адъютант маршала господин де Кастре и провел Балашева в приготовленное для него помещение.
Балашев обедал в этот день с маршалом в том же сарае, на той же доске на бочках.
На другой день Даву выехал рано утром и, пригласив к себе Балашева, внушительно сказал ему, что он просит его оставаться здесь, подвигаться вместе с багажами, ежели они будут иметь на то приказания, и не разговаривать ни с кем, кроме как с господином де Кастро.
После четырехдневного уединения, скуки, сознания подвластности и ничтожества, особенно ощутительного после той среды могущества, в которой он так недавно находился, после нескольких переходов вместе с багажами маршала, с французскими войсками, занимавшими всю местность, Балашев привезен был в Вильну, занятую теперь французами, в ту же заставу, на которой он выехал четыре дня тому назад.
На другой день императорский камергер, monsieur de Turenne, приехал к Балашеву и передал ему желание императора Наполеона удостоить его аудиенции.
Четыре дня тому назад у того дома, к которому подвезли Балашева, стояли Преображенского полка часовые, теперь же стояли два французских гренадера в раскрытых на груди синих мундирах и в мохнатых шапках, конвой гусаров и улан и блестящая свита адъютантов, пажей и генералов, ожидавших выхода Наполеона вокруг стоявшей у крыльца верховой лошади и его мамелюка Рустава. Наполеон принимал Балашева в том самом доме в Вильве, из которого отправлял его Александр.


Несмотря на привычку Балашева к придворной торжественности, роскошь и пышность двора императора Наполеона поразили его.
Граф Тюрен ввел его в большую приемную, где дожидалось много генералов, камергеров и польских магнатов, из которых многих Балашев видал при дворе русского императора. Дюрок сказал, что император Наполеон примет русского генерала перед своей прогулкой.
После нескольких минут ожидания дежурный камергер вышел в большую приемную и, учтиво поклонившись Балашеву, пригласил его идти за собой.
Балашев вошел в маленькую приемную, из которой была одна дверь в кабинет, в тот самый кабинет, из которого отправлял его русский император. Балашев простоял один минуты две, ожидая. За дверью послышались поспешные шаги. Быстро отворились обе половинки двери, камергер, отворивший, почтительно остановился, ожидая, все затихло, и из кабинета зазвучали другие, твердые, решительные шаги: это был Наполеон. Он только что окончил свой туалет для верховой езды. Он был в синем мундире, раскрытом над белым жилетом, спускавшимся на круглый живот, в белых лосинах, обтягивающих жирные ляжки коротких ног, и в ботфортах. Короткие волоса его, очевидно, только что были причесаны, но одна прядь волос спускалась книзу над серединой широкого лба. Белая пухлая шея его резко выступала из за черного воротника мундира; от него пахло одеколоном. На моложавом полном лице его с выступающим подбородком было выражение милостивого и величественного императорского приветствия.
Он вышел, быстро подрагивая на каждом шагу и откинув несколько назад голову. Вся его потолстевшая, короткая фигура с широкими толстыми плечами и невольно выставленным вперед животом и грудью имела тот представительный, осанистый вид, который имеют в холе живущие сорокалетние люди. Кроме того, видно было, что он в этот день находился в самом хорошем расположении духа.
Он кивнул головою, отвечая на низкий и почтительный поклон Балашева, и, подойдя к нему, тотчас же стал говорить как человек, дорожащий всякой минутой своего времени и не снисходящий до того, чтобы приготавливать свои речи, а уверенный в том, что он всегда скажет хорошо и что нужно сказать.
– Здравствуйте, генерал! – сказал он. – Я получил письмо императора Александра, которое вы доставили, и очень рад вас видеть. – Он взглянул в лицо Балашева своими большими глазами и тотчас же стал смотреть вперед мимо него.
Очевидно было, что его не интересовала нисколько личность Балашева. Видно было, что только то, что происходило в его душе, имело интерес для него. Все, что было вне его, не имело для него значения, потому что все в мире, как ему казалось, зависело только от его воли.
– Я не желаю и не желал войны, – сказал он, – но меня вынудили к ней. Я и теперь (он сказал это слово с ударением) готов принять все объяснения, которые вы можете дать мне. – И он ясно и коротко стал излагать причины своего неудовольствия против русского правительства.
Судя по умеренно спокойному и дружелюбному тону, с которым говорил французский император, Балашев был твердо убежден, что он желает мира и намерен вступить в переговоры.
– Sire! L'Empereur, mon maitre, [Ваше величество! Император, государь мой,] – начал Балашев давно приготовленную речь, когда Наполеон, окончив свою речь, вопросительно взглянул на русского посла; но взгляд устремленных на него глаз императора смутил его. «Вы смущены – оправьтесь», – как будто сказал Наполеон, с чуть заметной улыбкой оглядывая мундир и шпагу Балашева. Балашев оправился и начал говорить. Он сказал, что император Александр не считает достаточной причиной для войны требование паспортов Куракиным, что Куракин поступил так по своему произволу и без согласия на то государя, что император Александр не желает войны и что с Англией нет никаких сношений.
– Еще нет, – вставил Наполеон и, как будто боясь отдаться своему чувству, нахмурился и слегка кивнул головой, давая этим чувствовать Балашеву, что он может продолжать.
Высказав все, что ему было приказано, Балашев сказал, что император Александр желает мира, но не приступит к переговорам иначе, как с тем условием, чтобы… Тут Балашев замялся: он вспомнил те слова, которые император Александр не написал в письме, но которые непременно приказал вставить в рескрипт Салтыкову и которые приказал Балашеву передать Наполеону. Балашев помнил про эти слова: «пока ни один вооруженный неприятель не останется на земле русской», но какое то сложное чувство удержало его. Он не мог сказать этих слов, хотя и хотел это сделать. Он замялся и сказал: с условием, чтобы французские войска отступили за Неман.
Наполеон заметил смущение Балашева при высказывании последних слов; лицо его дрогнуло, левая икра ноги начала мерно дрожать. Не сходя с места, он голосом, более высоким и поспешным, чем прежде, начал говорить. Во время последующей речи Балашев, не раз опуская глаза, невольно наблюдал дрожанье икры в левой ноге Наполеона, которое тем более усиливалось, чем более он возвышал голос.
– Я желаю мира не менее императора Александра, – начал он. – Не я ли осьмнадцать месяцев делаю все, чтобы получить его? Я осьмнадцать месяцев жду объяснений. Но для того, чтобы начать переговоры, чего же требуют от меня? – сказал он, нахмурившись и делая энергически вопросительный жест своей маленькой белой и пухлой рукой.
– Отступления войск за Неман, государь, – сказал Балашев.
– За Неман? – повторил Наполеон. – Так теперь вы хотите, чтобы отступили за Неман – только за Неман? – повторил Наполеон, прямо взглянув на Балашева.
Балашев почтительно наклонил голову.
Вместо требования четыре месяца тому назад отступить из Номерании, теперь требовали отступить только за Неман. Наполеон быстро повернулся и стал ходить по комнате.
– Вы говорите, что от меня требуют отступления за Неман для начатия переговоров; но от меня требовали точно так же два месяца тому назад отступления за Одер и Вислу, и, несмотря на то, вы согласны вести переговоры.
Он молча прошел от одного угла комнаты до другого и опять остановился против Балашева. Лицо его как будто окаменело в своем строгом выражении, и левая нога дрожала еще быстрее, чем прежде. Это дрожанье левой икры Наполеон знал за собой. La vibration de mon mollet gauche est un grand signe chez moi, [Дрожание моей левой икры есть великий признак,] – говорил он впоследствии.
– Такие предложения, как то, чтобы очистить Одер и Вислу, можно делать принцу Баденскому, а не мне, – совершенно неожиданно для себя почти вскрикнул Наполеон. – Ежели бы вы мне дали Петербуг и Москву, я бы не принял этих условий. Вы говорите, я начал войну? А кто прежде приехал к армии? – император Александр, а не я. И вы предлагаете мне переговоры тогда, как я издержал миллионы, тогда как вы в союзе с Англией и когда ваше положение дурно – вы предлагаете мне переговоры! А какая цель вашего союза с Англией? Что она дала вам? – говорил он поспешно, очевидно, уже направляя свою речь не для того, чтобы высказать выгоды заключения мира и обсудить его возможность, а только для того, чтобы доказать и свою правоту, и свою силу, и чтобы доказать неправоту и ошибки Александра.
Вступление его речи было сделано, очевидно, с целью выказать выгоду своего положения и показать, что, несмотря на то, он принимает открытие переговоров. Но он уже начал говорить, и чем больше он говорил, тем менее он был в состоянии управлять своей речью.
Вся цель его речи теперь уже, очевидно, была в том, чтобы только возвысить себя и оскорбить Александра, то есть именно сделать то самое, чего он менее всего хотел при начале свидания.
– Говорят, вы заключили мир с турками?
Балашев утвердительно наклонил голову.