Форматы исполняемых файлов: различия между версиями

м
замена категории на шаблон для работы полки, removed: Категория:Программирование с помощью AWB
м (замена категории на шаблон для работы полки, removed: Категория:Программирование с помощью AWB)
Данная работа является попыткой составить единый справочник по работе с исполняемыми файлами, их анализа, разбора и создания исполняемого образа, готового для работы в памяти. Скриптовый формат исполняемых файлов оставим на откуп соответствующих руководств по языкам программирования, а рассмотрим именно двоичные форматы.
 
== Исторический экскурс ==
 
Одним из простейших форматов исполняемых файлов на архитектуре x86 является файл с расширением [[w:.COM|.COM]] (здесь и далее при использовании расширений файлов операционных система семейства CP/M будет использоваться запись расширения файла в верхнем регистре, а для операционных систем семейства Unix будет использоваться нижний регистр для суффикса имени файла). Истоки данного формата файла идут из операционной системы CP/M для процессора Intel 8080, известной своей широкой популярностью. Формат файла предполагает использование для создания команд (COM - сокращение от COMMAND), расширяющий базовую функциональность операционной системы.
При разработке MS-DOS формат .COM сохранился практически без изменения и обеспечивает совместимость на уровне исходного кода с CP/M. Двоичный формат специфичен для каждого типа процессора. Формат подразумевает исполнение в пределах одного сегмента (64Кб), что не позволяло использовать возможности оперативной памяти в полной мере.
 
Формат [[w:.EXE|.EXE]] появился в QDOS/86-DOS (позднее продаваемой под брендом MS-DOS) в 1981 году и был разработан Марком Збиковски (Mark Zbikowski), о чем свидетельствует сигнатура MZ (или ZM в некоторых старых версиях редакторов обратных связей) в первых двух байтах файла. В отличие от формата .COM, где для кода, данных и стека используется один и тот же сегмент, в формате .EXE были сняты данные ограничения, что делало доступным все адресное пространство компьютера.
 
Развитие машин класса IBM PC привело к появлению новых режимов адресации, появлению виртуальной памяти и прочих механизмов, что делало формат .EXE [[w:MZ (формат)|MZ]] недостаточно гибким и не приспособленным к реалиям. В частности, многие производители реализовывали так называемые оверлеи, что позволяло осуществлять простейшую подкачку нужных функций в ОЗУ. Плюс, неэффективное использование повторяющегося исполняемого кода привело к реализации библиотек динамического связывания, код которых мог использоваться различными процессами без его дублирования в физической памяти. В итоге формат .EXE был расширен и были реализованы его более современные версии [[w:Linear Executable|LX/LE]] и [[w:New Executable|NE]].
В кросс платформенной OS/2 (OS/2 PPC, Workstation OS) конечным форматом файлы был принят формат ELF, о котором будет сказано несколько дальше.
 
В мире операционных систем семейства Unix также наблюдалось развитие форматов исполняемых файлов. Первый формат, a.out, появился с первой версией UNIX. На наименование повлияла специфика процесса получения двоичного файла. В отличие от систем семейства CP/M, для которых всегда была характерна нехватка памяти, Unix системы позволяли осуществлять полный цикл: компиляция, компиляция, компоновка. a.out - это сокращение от assembler output. Формат a.out по структуре похож на форматы .EXE. За свое существование претерпел ряд модификаций.
 
С появлением разделяемых библиотек формат a.out из-за ряда ограничений был заменен на формат COFF. Из основных нововведений - это добавление отладочной информации и относительного виртуального адреса, что позволило загружать его по произвольному фактическому адресу. Использование формата COFF в Unix системах в настоящее время ограничено, однако формат .EXE PE является наиболее известным вариантом формата COFF.
== Исследования в области языков описания форматов файлов ==
 
 
[[Категория:Программирование]]
 
[[Категория:{{Темы|Программирование]]}}
531

правка