Содержат программы на машинном языке файлы с расширением какие
Исполняемый файл - словосочетание, довольно часто встречающееся, в основном, в документации. В живом общении (в том числе и в виртуальном) для обозначения данного вида файлов пользователи используют менее громоздкие термины, более точно отражающие, что именно они имеют в виду.
Итак, что же скрывается за этим словосочетанием? Исполняемыми файлами называются файлы, содержащие в себе готовые к запуску компьютерные программы. В зависимости от того, в каком виде записана программа в исполняемом файле, выделяют две большие подгруппы файлов данного класса. Первая подгруппа - это бинарные файлы; они содержат в себе запись программы в виде специальных машинных кодов, которые, чаще всего, передаются непосредственно процессору. Такие файлы ещё сокращённо называют бинарниками. В противоположность им существуют исполняемые файлы, в которых программа записана в виде текста - то есть, в том самом виде, в каком с ней работал создавший её программист. Такие исполняемые файлы называют скриптами. Также этот термин нередко употребляют и по отношению к самим программам, которые хранятся в подобных файлах.
Для выполнения программ из большинства бинарных исполняемых файлов достаточно только операционной системы, которая их поддерживает. Для выполнения скриптов нужен интерпретатор, который будет переводить текст программы последовательно в процессорные команды. Для запуска некоторых исполняемых файлов бинарного формата также нужны интерпретаторы.
В Windows наиболее распространены бинарные исполняемые файлы. Самый часто встречающийся их вид - это приложение. Приложения имеют расширения EXE и могут запускаться самостоятельно. Помимо них, существуют динамические библиотеки (их расширение - DLL), которые содержат в себе общие для разных приложений функции. Ещё есть драйверы (DRV или VXD) - специальные программы, нужные для того, чтобы система могла взаимодействовать с конкретными моделями тех или иных устройств. Исполняемые файлы (в Windows особенно) могут зависеть друг от друга: например, для запуска любого приложения нужны определённые системные динамические библиотеки, а им, в свою очередь, нужны драйверы.
Следует заметить, что исполняемые файлы содержат в себе не только непосредственно сами программы, но и разные дополнительные данные. Это могут быть различные графические ресурсы, отображаемые программой, тексты надписей, описания диалоговых окон и т.п. Ярким примером этого могут служить самораспаковывающиеся архивы, которые содержат внутри себя большие объёмы упакованной с целью уменьшения её объёма при передаче или хранении информации.
Объектный файл представляет собой компьютерный файл , содержащий объектный код , то есть, машинный код выход на ассемблере или компилятор . Код объекта обычно перемещаемый , и обычно не непосредственно исполняемый файл . Существуют различные форматы объектных файлов, и один и тот же машинный код может быть упакован в разные форматы объектных файлов. Объектный файл может также работать как разделяемая библиотека .
Помимо самого объектного кода, объектные файлы могут содержать метаданные, используемые для связывания или отладки, в том числе: информацию для разрешения символьных перекрестных ссылок между различными модулями, информацию о перемещении, информацию о раскручивании стека , комментарии , символы программы , информацию об отладке или профилировании . Другие метаданные могут включать дату и время компиляции, имя и версию компилятора и другую идентифицирующую информацию.
Термин «объектная программа» появился как минимум в 1950-х годах:
Термин в автоматическом программировании для программы на машинном языке, созданной машиной путем перевода исходной программы, написанной программистом, на язык, похожий на алгебраическую нотацию.
Программист генерирует объектный код с помощью компилятора или ассемблера . Так , например, под Linux , то GNU Compiler Collection компилятор будет генерировать файлы с расширением .o которые используют ELF формат. Компиляция в Windows создает файлы с расширением .obj, которые используют формат COFF . Затем компоновщик используется для объединения объектного кода в одну исполняемую программу или библиотеку, при необходимости извлекая предварительно скомпилированные системные библиотеки. Программы JavaScript интерпретируются, в то время как программы Python и Java компилируются в файлы с байт-кодом .
СОДЕРЖАНИЕ
Форматы объектных файлов
Есть много различных форматов объектных файлов; Первоначально у каждого типа компьютера был свой уникальный формат, но с появлением Unix и других переносимых операционных систем некоторые форматы, такие как ELF и COFF , были определены и использовались в различных типах систем. Один и тот же формат можно использовать как для ввода и вывода компоновщика , так и для формата библиотеки и исполняемого файла. Некоторые форматы могут содержать машинный код для разных процессоров, причем правильный код выбирается операционной системой при загрузке программы.
Некоторые системы делают различие между форматами, которые являются непосредственно исполняемыми, и форматами, которые требуют обработки компоновщиком. Например, OS / 360 и ее последователи называют первый формат загрузочным модулем, а второй - объектным модулем . В этом случае файлы имеют совершенно разные форматы.
Дизайн и / или выбор формата объектного файла является ключевой частью общего дизайна системы. Это влияет на производительность линкера и , таким образом , программисту поворот в то время как программа разрабатывается. Если формат используется для исполняемых файлов, дизайн также влияет на время, необходимое для запуска программ , и, следовательно, на скорость отклика для пользователей.
Абсолютные объектные файлы
Многие ранние компьютеры или небольшие микрокомпьютеры поддерживают только абсолютный объектный формат. Программы не могут быть перемещены; они должны быть собраны или скомпилированы для выполнения по определенным заранее определенным адресам. Файл не содержит информации о перемещении или привязке. Эти файлы могут быть загружены в память для чтения / записи или сохранены в постоянной памяти . Например, монитор Motorola 6800 MIKBUG содержит процедуру для чтения абсолютного объектного файла ( формат SREC ) с бумажной ленты . COM-файлы DOS являются более поздним примером абсолютных объектных файлов.
Сегментация
Большинство форматов объектных файлов структурированы как отдельные разделы данных, каждый из которых содержит определенный тип данных. Эти разделы известны как «сегменты» из-за термина « сегмент памяти », который ранее был распространенной формой управления памятью . Когда программа загружается в память загрузчиком , загрузчик выделяет программе различные области памяти. Некоторые из этих областей соответствуют сегментам объектного файла и поэтому обычно известны под одними и теми же именами. Другие, например стек, существуют только во время выполнения. В некоторых случаях перемещение выполняется загрузчиком (или компоновщиком) для указания фактических адресов памяти. Однако для многих программ или архитектур в перемещении нет необходимости, поскольку оно выполняется блоком управления памятью или независимым от позиции кодом . В некоторых системах сегменты объектного файла затем могут быть скопированы (выгружены) в память и выполнены без необходимости дальнейшей обработки. В этих системах это может выполняться лениво , то есть только тогда, когда на сегменты ссылаются во время выполнения, например, через отображаемый в память файл, поддерживаемый объектным файлом.
Типы данных, поддерживаемые типичными форматами объектных файлов:
- Заголовок (описательная и контрольная информация)
- Сегмент кода («текстовый сегмент», исполняемый код)
- Сегмент данных (инициализированные статические переменные )
- Сегмент данных только для чтения ( родата, инициализированные статические константы )
- Сегмент BSS (неинициализированные статические данные, как переменные, так и константы)
- Внешние определения и ссылки для ссылки
- Информация о переезде
- Динамическая компоновка информации
- Отладочная информация
Сегменты в разных объектных файлах могут быть объединены компоновщиком в соответствии с правилами, указанными при определении сегментов. Существуют соглашения для сегментов, совместно используемых объектными файлами; например, в DOS существуют разные модели памяти, которые определяют имена специальных сегментов и то, могут ли они быть объединены.
Отладочная информация может быть либо неотъемлемой частью формата файла объекта, как и в COFF , или полунезависимое формат , который может быть использован с несколькими форматами объектов, таких как уколов или DWARF .
Проект GNU «s Binary библиотека Descriptor File (библиотека BFD) обеспечивает общий API для манипуляции объектных файлов в различных форматах.
Логическая запись при хранении на внешних носителях является той же информационной единицей, что и при хранении в ОЗУ. Отличие состоит в том, что при хранении на носителе запись является минимальным и неделимым элементом представления данных. Это означает, что после размещения записи на носителе отсутствует доступ к ее отдельным полям, а операции переноса на носитель и считывание с него производятся целиком со всей записью. Поскольку обработка записей при их хранении не происходит, не требуется и различия типов данных, т.е. запись может состоять из одного элементарного данного, группы данных или содержать структурированные данные. Единственной характеристикой отдельной записи является ее длина, а допустимыми операциями - перенос на носитель и считывание и него.
После размещения данных на носителе они превращаются в физическую запись.
Физическая запись – элемент поверхности носителя, на котором в соответствии с физическими принципами функционирования носителя размещаются данные, составляющие логическую запись.
Объединение физических записей образует файл.
Файл – поименованная совокупность данных, хранящихся на внешнем носителе.
Любые файлы содержат данные, закодированные с помощью двоичного алфавита. Однако способы кодирования и назначение файлов могут быть различными. По этой причине файлам приписывается еще одна характеристика – тип. Тип входит в идентификатор файла и указывается в виде расширения имени, например, Глава_7.doc, proba.pas или calc.exe. Принципиально различными по типам следует считать программные (исполняемые) файлы и файлы данных. Программные файлы содержат тексты программ в машинном коде; они могут быть загружены в ОЗУ и исполняться. Программные файлы имеют расширение com или exe; к этой же категории относятся так называемые командные файлы (расширение bat), содержащие в текстовом формате команды MS DOS, которые могут последовательно выполняться как программа. Файлы данных формируются в результате работы какой-либо программы; они не являются исполняемыми и служат только в качестве хранилищ данных. Многие программные системы при формировании файлов данных приписывают им вполне определенные расширения – по ним можно установить, какой программой файл создан; например, расширения txt, doc, rtf имеют файлы, подготовленные в текстовых редакторах, bmp, jpg, gif, cdr – графические файлы, pas, bas, c – файлы с текстами программ и т.д. Тип файла, как и его, собственно имя, являются частью описания файла и сохраняются системой, ведающей размещением файлов на носителе.
Самым верхним уровнем представления данных на внешних носителях являются структуры файлов – каталоги (в операционной системе Windows-95, 98 принят термин «папки»).
Каталог – это поименованная совокупность файлов и подкаталогов (т. е. вложенных каталогов). Каталог самого верхнего уровня иерархии называется корневым. Он не вложен ни в какие другие каталоги.
Создает и поддерживает файловые структуры, определяет максимальный уровень вложенности каталогов, а также производит все операции с файлами и каталогами часть операционной системы компьютера – файловая система.
Путь к файлу – это последовательность, состоящая из имен каталогов (разделенных символом «\»), начиная от корневого и заканчивая тем, в котором непосредственно хранится файл.
Полное имя файла состоит из имени логического диска, пути к файлу и имени файла. В одном каталоге не может быть нескольких файлов и каталогов с одинаковыми именами. В разных каталогах это допустимо.
Логический диск – это физический (реальный) диск или часть физического диска, которому присвоено собственное имя.
Имена логических дисков задаются первыми буквами латинского алфавита с двоеточием: A:,B:,C: и т.д. Обычно с одним гибким магнитным диском связан один логический диск (A:, B:), а жесткий диск делится на несколько логических (C:, D: и т.д.).
Дерево: графическое изображение иерархической файловой структуры диска.
Структура дисков
Устройства внешней памяти: магнитные диски и ленты, оптические (лазерные) диски, магнитооптические диски.
Дисководы – устройства чтения/записи информации на диски. Различают гибкие магнитные диски – дискеты и жесткие магнитные диски. Жесткие магнитные диски встроены в дисковод и в отличие от дискет являются несъемными.
Структура магнитного диска: одна или несколько сторон (магнитных поверхностей), разделенных на концентрические дорожки, каждая из которых, в свою очередь, поделена на сектора, состоящие из «клеточек» - байтов. Все секторы на одном диске имеют фиксированный размер. Вся работа по считыванию и записи данных на дисках производится только полными секторами. Полный объем памяти диска определяется формулой:
ОБЪЕМ = СТОРОНЫ * ДОРОЖКИ * СЕКТОРА * БАЙТЫ,
Где СТОРОНЫ – количество сторон диска, ДОРОЖКИ – количество дорожек на стороне, СЕКТОРА – количество секторов на дорожке, БАЙТЫ – количество байт в секторе.
Информация на устройствах внешней памяти имеет файловую организацию.
Примеры решенных задач.
Пример №1.
Дано дерево файловой структуры диска. Заглавными буквами обозначены имена каталогов, строчными – имена файлов.
Перечислить имена каталогов 1-го, 2-го, 3-го уровней. Указать путь к файлу letter.txt от корневого каталога. Указать путь к файлу letter1.doc от корневого от корневого каталога, а к файлу letter2.doc – от каталога WORK. Указать полные имена файлов letter.txt и letter1.doc, если файловая структура хранится на диске C.
Каталоги 1-го уровня COMPUTER, WORK,UROK. Каталоги второго уровня – IBM, APPLE, DOCUMENT, PRINT. Каталоги 3-го уровня – DOC1, DOC2.
Путь к файлу letter.txt от корневого каталога: \WORK\PRINT. Путь к файлу letter1.doc от корневого каталога: \WORK\DOCUMENT\DOC2. Пут к файлу letter2.doc от каталога WORK\DOCUMENT\DOC2.
Полные имена файлов letter.txt и letter1.doc:
C:\WORK\PRINT\letter.txt и
C:\WORK\DOCUMENT\DOC2\letter1.doc
Задания для самостоятельной работы.
№1. Двухсторонняя дискета имеет объем 1200 Кбайт. Сколько дорожек на одной стороне дискеты, если каждая дорожка содержит 15 секторов по 4096 бит?
№2. Какой объем имеет двухсторонняя дискета, если каждая сторона ее разбита на 80 дорожек по 20 секторов на дорожке? Объем каждого сектора составляет 0.5 Кбайт.
№3. Какой объем имеет каждый сектор двухсторонней дискеты емкостью 1440 Кбайт, если каждая сторона дискеты разбита на 80 дорожек по 18 секторов на дорожке?
№4. Сколько файлов размером 100 Кбайт каждый можно разместить на дискете объемом 1) 1,2 Мбайт; 2) 1.44 Мбайт?
№5. В результате повреждения односторонней дискеты 10% секторов оказались дефектными, что составило 36864 байта. Какой объем имеет дискета?
№6. На скольких дискетах емкостью 1440 Кбайт можно разместить содержимое жесткого диска объемом 1 Гбайт?
№7. Дано дерево иерархической файловой структуры на магнитном диске. Заглавными буквами обозначены имена каталогов, строчными – имена файлов:
Перечислить каталоги 1-го, 2-го, 3-го уровней, если они есть. Указать пути от корневого каталога к каждому из файлов.
№8. Указаны пути от корневого каталога к некоторым файлам, хранящимся на магнитном диске. Заглавными буквами обозначены имена каталогов, строчными – имена файлов:
Директива «use 16» указывает на генерирование 16-битного кода. «org 100h» объявляет пропуск 256 байт (адреса 0000h – 00FFh). Указанные адреса зарезервированы под служебные данные (PSP).
Далее следуют команды. В регистр DX помещается адрес строки hello. Затем вызывается функция номер 9 прерывания 21h для вывода строки на экран.
Завершение работы программы осуществляется вызовом функции 4C с параметром того же прерывания 21h.
Строка hello завершается символом ‘$’, который в системе DOS обозначает конец строки.
Следует помнить, что программы типа COM не поддерживаются 64-разрядными ОС Windows. Для запуска таких программ под этими операционными системами следует использовать программу DOSBox, либо воспользоваться форматом PE, рассмотренном ниже.
Формат MZ
MZ — стандартный формат 16-битных исполнимых файлов с расширением .EXE для DOS. Назван так по сигнатуре — ASCII-символам MZ (4D 5A) в первых двух байтах.
Пример простой программы с использованием формата MZ:
Для создания нужно использовать директиву «format MZ». По умолчанию код для этого формата 16-битный.
«segment» определяет новый сегмент, за ним должна следовать метка, чьим значением будет номер определяемого сегмента. Опционально за этой директивой может следовать «use16» или «use32», чтобы указать разрядность кода в сегменте. Начало сегмента выровнено по параграфу (16 байт). Все метки, определенные далее, будут иметь значения относительно начала этого сегмента. В примере выше объявляются 2 сегмента: «data_seg» и «code_seg».
«entry» устанавливает точку входа для формата MZ, за ней должен следовать дальний адрес (имя сегмента, двоеточие и смещение в сегменте) желаемой точки входа. В нашем случае объявлена метка «start».
«stack» устанавливает стек для MZ. За директивой может следовать числовое выражение, указывающее размер стека для автоматического создания, либо дальний адрес начального стекового фрейма, если вы хотите установить стек вручную. Если стек не определен, он будет создан с размером по умолчанию в 4096 байт.
«heap» со следующим за ней значением определяет максимальный размер дополнительного места в параграфах (это место в добавление к стеку и для неопределенных данных). Используйте «heap 0», чтобы всегда отводить только память, которая программе действительно нужна.
Формат MZ, аналогично COM-программам, не поддерживается 64-рязрядными ОС Windows.
Формат PE
PE — это сокращение от Portable Executable, т.е. переносимый (универсальный) исполняемый файл. Этот формат появился еще в поздние времена Windows 3.11, но настоящее распространение получил с расцветом Windows 95. Можно сказать, что сейчас на компьютерах с Windows 9x/2K/XP/Vista/7 находится 95% исполняемых (exe, dll, драйверы(sys)) файлов — это PE файлы.
Чтобы выбрать формат PE, нужно использовать директиву «format PE», за ней могут следовать дополнительные настройки формата: «console», «GUI» или оператор «native», чтобы выбрать целевую подсистему (далее может следовать значение с плавающей точкой, указывающее версию подсистемы), «DLL» помечает файл вывода как динамическую связывающую библиотеку. Далее может следовать оператор «at» и числовое выражение, указывающее базу образа PE, и опционально оператор «on» со следующей за ним строкой в кавычках, содержащей имя файла, выбирающей заглушку MZ для PE программы (если указанный файл не в формате MZ, то он трактуется как простой двоичный исполняемый файл и конвертируется в формат MZ). По умолчанию код для этого формата 32-битный.
Пример объявления формата PE со всеми свойствами:
format PE GUI 4.0 DLL at 7000000h on 'stub.exe'
«section» определяет новую секцию, за ней должна следовать строка в кавычках, определяющая имя секции, и далее могут следовать один или больше флагов секций. Возможные флаги такие: «code», «data», «readable», «writeable», «executable», «shareable», «discardable», «notpageable». Начало секции выравнивается по странице (4096 байт).
Пример объявления секции PE:
section '.text' code readable executable
Вместе с флагами также может быть определен один из специальных идентификаторов данных PE, отмечающий всю секцию как специальные данные, возможные идентификаторы: «export», «import», «resource» и «fixups». Если секция помечена для содержания настроек адресов, они генерируются автоматически, и никаких данных определять больше не требуется. Также данные ресурсов могут быть сгенерированы автоматически из файлов ресурсов, этого можно добиться, написав после идентификатора «resourse» оператор «from» и имя файла в кавычках.
Ниже вы можете увидеть примеры секций, содержащих некоторые специальные данные:
section '.reloc' data discardable fixups
section '.rsrc' data readable resource from 'my.res'
«entry» создает точку входа для PE, далее должно следовать значение точки входа.
«stack» устанавливает размер стека для PE, далее должно следовать значение зарезервированного размера стека, опционально может следовать отделенное запятой значение начала стека. Если стек не определен, ему присваивается размер по умолчанию, равный 4096 байт.
«heap» выбирает размер дополнительного места для PE, далее должно следовать значение для зарезервированного для него места, опционально ещё может быть значение его начала, отделенное запятой. Если дополнительное место не определено, оно ставится по умолчанию равным 65536 байт, если не указано его начало, то оно устанавливается равным 0.
«data» начинает определение специальных данных PE, за директивой должен следовать один из идентификаторов данных («export», «import», «resource» или «fixups») или номер записи данных в заголовке PE. Данные должны быть определены на следующих строках и заканчиваться директивой «end data». Если выбрано определение настроек адресов, они генерируются автоматически, и никаких данных определять больше не требуется. То же самое относится к ресурсам, если за идентификатором «resourse» следует оператор «from» и имя файла в кавычках — в этом случае данные берутся из этого файла ресурсов.
Пример простой программы с использованием формата PE:
В данном примере для работы с консолью использованы функции WinAPI.
Вот такой получился краткий (надеюсь, для кого-то полезный) обзор использования форматов PE и MZ. За бортом данной статьи оказались ELF и COFF, за что прошу сильно не судить.
Читайте также: