Меню

Формат исполняемого файла linux

Что эквивалентно «exe-файлу»?

Я не знаю, каково точное расширение исполняемого файла. Это .deb или .tar.gz ?

В Windows нет стандартного File-Extention, подобного файлу «.exe».

В Linux практически любой файл может быть исполняемым. Окончание файла просто описывает (но не обязательно), что или как файл «исполняется».

Например, скрипт оболочки заканчивается на .sh и «выполняется» через оболочку bash.

В своем вопросе вы спрашиваете .deb и .tar.gz. Хорошо. Файл .deb устанавливает программное обеспечение в вашей системе (пожалуйста, будьте осторожны!), А файл .tar.gz представляет собой сжатый файл, такой как .zip, который вы могли бы узнать по Окна.

Я бы суммировал систему следующим образом:

Любой файл, начинающийся с #! (называемый shebang или hashbang) в первой строке, является просто сценарием. Путь после шебанга — это путь к программе (исполняемому файлу), которая должна проанализировать скрипт, при условии, что для файла было установлено разрешение на выполнение chmod a+x filename .

Поэтому, ответьте на свой оригинальный вопрос, расширения нет, или редко, это .elf или .bin .

Это сделано вики-сообществом, поэтому любой может добавить запись.

Концепция исполняемого файла отличается в Unix / Linux от Windows.

Windows

Все, что заканчивается .exe или .com становится исполняемым файлом.

Linux / Unix

Каждый файл имеет исполняемый бит, поэтому любой файл может быть выполнен, в отличие от Windows. Чтобы увидеть, является ли файл исполняемым, вы можете проверить его свойства (вкладка «Разрешения») или даже увидеть их помеченные в терминале (все они отмечены *).

Даже текстовые файлы (например, сценарии оболочки) могут иметь свои исполняемые биты и запускаться как единое целое.

Чтобы узнать, что операционная система UNIX думает о типе конкретного файла, вы используете команду file:

В приведенном выше примере я указываю путь к программе ‘ls’, вы должны заменить путь к вашему файлу.

Файл сценария будет выглядеть так:

Случайный текстовый файл:

Он даже достаточно умен, чтобы правильно идентифицировать программу Windows, если у вас есть одна, лежащая на вашем компьютере с UNIX:

И когда он не может понять, что это за файл (но может открыть его), он называет это данными:

Выполнение файла в Linux вообще не связано с именем файла или расширением. Любой файл может быть потенциально выполнен при условии, что он обрабатывается binfmt механизмом ядра (и что для него установлены разрешения на выполнение).

Наиболее распространенным форматом для исполняемого файла является ELF , хотя некоторые ядра могут быть скомпилированы для поддержки старого a.out формата. (Для получения полной технической информации, binfmt_elf.c это где искать.)

Другим распространенным механизмом является «притон» система, обрабатывается binfmt_script , который ищет #!/path/to/interpreter в начале файла.

binfmt_misc позволяет для регистрации других обработчиков, как описано здесь .

Если вам нравится заниматься программированием ядра, вы даже можете написать свой собственный .

Хотя это и не связано напрямую, file команда должна указать вам, является ли файл исполняемым файлом ELF или чем-то еще.

Соглашение об именах не имеет ничего общего с состоянием исполняемого файла (кроме случаев, когда он используется для binfmt_misc регистрации). Они просто соглашения. Как правило, .exe файл, найденный в Linux, может быть моно-приложением , получившим .exe расширение в соответствии с соглашением, исходящим из мира Windows / .Net.

Другой аспект, который может возникнуть, когда вы хотите «запустить» файл, — это иметь инструмент проводника, который использует расширения регистра, чтобы иметь возможность запустить программу, которая откроет эти файлы. Это то, что произойдет, если вы дважды щелкнете по a .txt , .tar.gz или .deb , например: файлы не являются ни исполняемыми, ни исполняемыми, но то, что вы используете для двойного щелчка, выбирает, какой исполняемый файл нужно открыть, чтобы открыть эти файлы.

В Windows .exe-файл — это компьютерный файл, который заканчивается расширением «.exe», которое обычно называют исполняемым файлом. Когда вы нажимаете exe-файл, встроенная подпрограмма автоматически выполняет код, который может привести в движение несколько функций. EXE-файлы обычно используются для установки файлов в операционной системе Windows.

Читайте также:  Reset dns windows 10

Кроме того, у вас есть файлы .tar, обычно известные как сжатые файлы. В версиях Linux, таких как Ubuntu, функции используются в различных дистрибутивах программного обеспечения, причем большая часть исходного кода программного обеспечения доступна в формате tar.gz. Из этого можно предположить, что tar. gz — это форма хорошо известного формата .tar, который используется для архивирования.

В Ubuntu, с другой стороны, формат файла .deb больше похож на файл .exe в windows. Когда вы открываете его, центр программного обеспечения обрабатывает его код и устанавливает содержащуюся в нем программу, такую ​​как исполняемый файл.

Даже если вы по-прежнему можете устанавливать программное обеспечение и пакеты из исходного формата (tar.gz), наиболее подходящим форматом для установки программного обеспечения является .deb. Возьмем, к примеру, Ubuntu Software Center; все приложения, которые он содержит, на самом деле являются файлами .deb. В целом, в linux почти каждый формат файла (включая .deb и tar.gz, а также хорошо известные файлы bash .sh) может вести себя как исполняемый файл, так что вы можете установить пакеты или программное обеспечение с этим.

В Windows нет эквивалента расширению exe, указывающему на то, что файл является исполняемым. Вместо этого исполняемые файлы могут иметь любое расширение и, как правило, вообще не иметь расширения .

Linux / Unix использует права доступа к файлам , чтобы указать , если файл может быть выполнен. В частности, есть разрешение на выполнение файла, которое сообщает системе, что этот файл разрешено выполнять. Однако отсутствие этого разрешения не означает, что файл не является исполняемым; просто, что соответствующий пользователь не имеет права пытаться выполнить его. Точно так же наличие этого разрешения не всегда указывает на то, что файл является допустимым исполняемым файлом.

Linux / Unix имеет двоичный формат исполняемых файлов, называемый ELF, который эквивалентен двоичным исполняемым форматам PE (Windows) или MZ / NE (DOS), которые обычно имеют расширение .exe.

Тем не менее, другие типы файлов могут быть исполняемыми, в зависимости от оболочки. Как правило, если вы пытаетесь выполнить файл, который система не распознает как двоичный исполняемый файл (например, формат ELF), то он интерпретируется текущим интерпретатором оболочки. Это выполняет тот же эффект, что и пакетные файлы в Windows или DOS, за исключением того, что опять-таки это не расширение, которое определяет его тип или способ его выполнения.

Файлы оболочки могут необязательно начинаться с хеш-бенга (первые два символа в файле #! сопровождаются путем к интерпретатору), и в этом случае вместо интерпретации остальной части файла с помощью текущего интерпретатора оболочки он может запустить альтернативную оболочку или интерпретатор для выполнить файл. Таким образом, вы можете иметь сценарий на любом интерпретируемом языке и при этом запускать его с правильным интерпретатором при попытке выполнения сценария.

Файлы EXE и DLL являются переносимыми исполняемыми файлами. Они основаны на Unix-файлах PE / COFF.

Прочитайте http://en.wikipedia.org/wiki/Portable_Executable для получения дополнительной информации.

В Ubuntu у вас нет определенного расширения для исполняемого файла. Обычно это файлы, которые названы в честь приложения, к которому они относятся.

Важным фактором является то, что в этих файлах установлен исполняемый бит. Если у вас есть цветной терминал, вы заметите, что это другой цвет при использовании ls .

В файловой системе Unix бинарные исполняемые файлы обычно хранятся в собственном месте.

  1. / bin (основные двоичные файлы)
  2. / sbin (системные двоичные файлы)
  3. / usr / bin (двоичные файлы приложения)

тогда как другие ресурсы приложения могут храниться в / usr / lib / или / usr / share /

Файл deb более корректно соответствует файлу msi в windows (то есть установщику пакета).

Источник

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

ELF (Executable and Linkable Format)

ELF (англ. Executable and Linkable Format — формат исполнимых и компонуемых файлов) — формат двоичных файлов, используемый во многих современных UNIX-подобных операционных системах, таких как FreeBSD, Linux, Solaris и др [Источник 1] . Также этот формат используется и во многих других системах.

Содержание

История

Формат ELF был разработан и представлен Лабораторией Юникс (UNIX System Laboratories), как часть двоичного интерфейса приложений ABI (англ. Application Binary Interface, ABI ) операционной системы UNIX System V. Затем он был выбран комитетом TIS в качестве основного файлового формата для операционных систем, работающих на 32-разрядной аппаратной архитектуре Intel x86. ELF достаточно быстро набрал популярность и после того, как компания HP расширила формат и опубликовала стандарт ELF-64, распространился на 64-разрядные платформы. Он является основным файловым форматом во всех Unix-подобных операционных системах, при этом постепенно охватывая мобильные платформы.

ELF был призван упростить и стандартизировать разработку, предоставляя программистам чёткую и понятную структуру файла.

Стандарт формата ELF различает несколько типов файлов:

  • Перемещаемый файл — хранит инструкции и данные, которые могут быть связаны с другими объектными файлами. Результатом такой связи может быть разделяемый объектный файл или исполняемый файл. К этому типу относятся объектные файлы статических библиотек.
  • Разделяемый объектный файл — также содержит инструкции и данные и может быть связан с другими перемещаемыми файлами и разделяемыми объектными файлами, в результате чего будет создан новый объектный файл, либо при запуске программы на выполнение операционная система может динамически связать его с исполняемым файлом программы, в результате чего будет создан исполняемый образ программы. В последнем случае речь идет о разделяемых библиотеках.
  • Исполняемый файл — содержит полное описание, позволяющее системе создать образ процесса. В том числе: инструкции, данные, описание необходимых разделяемых объектных файлов и необходимую символьную и отладочную информацию.

Формат

Структуру файла можно рассматривать с двух сторон: со стороны компоновщика (линкера) и со стороны загрузчика [Источник 2] . Любой файл состоит из:

  • ELF-заголовка (англ.ELF header ), в котором указаны общие характеристики файла: тип (исполнения или компоновки), архитектура процессора, виртуальный адрес точки входа и др.;
  • таблицы программных заголовков (англ.program header table ), которая служит для описания сегментов файла;
  • таблицы заголовков секций (англ.section header table ), которая характеризует секции файла.

Сегмент — это непрерывная область адресного пространства со своими атрибутами доступа. Сегмент кода имеет атрибут исполнения, а сегмент данных — атрибуты чтения и записи. В зависимости от типа сегмента величина выравнивания в памяти может варьироваться от 4h до 1000h байт (для архитектуры x86). В самом ELF-файле сегменты не выравниваются и хранятся плотно прижатыми друг к другу. Ближайший аналог — секции в PE-файлах Windows

Сегмент в ELF-файлах может быть разбит на одну или несколько частей — секций. Типичный кодовый сегмент состоит из секций .init (процедуры инициализации), .plt (секции связок), .text (основной код программы) и .finit (процедуры финализации).

В формате компоновки таблица заголовков программы не является обязательной, так как компоновщик игнорирует сегменты и работает только на уровне секций. Системный загрузчик, загружающий исполняемый ELF-файл в память, игнорирует секции и оперирует целыми сегментами. Компоновщик комбинирует секции с похожими атрибутами и оптимальным образом размещает их по сегментам при сборке файла. Также он помещает копию таблицы секций в исполняемый файл, несмотря на то, что системный загрузчик игнорирует таблицу секций. При этом облегчается работа отладчиков (например, GDB) и дизассемблеров (например, IDA Pro).

Заголовок файла

Заголовок файла (ELF Header) имеет фиксированное расположение в начале файла и содержит общее описание структуры файла и его основные характеристики, такие как: тип, версия формата, архитектура процессора, виртуальный адрес точки входа, размеры и смещения остальных частей файла.

Читайте также:  Как google chrome сделать браузером по умолчанию для windows 10

Структура ELF-заголовка

Назначение элементов массива e_ident

Элемент Значение Описание
e_ident[0] ‘\x7f’ Сигнатура
e_ident[1] ‘E’ Сигнатура
e_ident[2] ‘L’ Сигнатура
e_ident[3] ‘F’ Сигнатура
e_ident[4] 1 Размер слова: 0 — неизвестно, 1 — 32 бита, 2 — 64 бита
e_ident[5] 1 Порядок байт: 0 — неизвестно, 1 — little-endian, 2 — big-endian
e_ident[6] 1 Версия формата ELF: 0 — неизвестно, 1 — текущая версия
e_ident[7] ОС и бинарный интерфейс, для Linux — 0
e_ident[8] Версия бинарного интерфейса, для Linux — 0
e_ident[9] — e_ident[15] Зарезервировано
Возможные значения поля e_type

Имя Значение Описание
ET_NONE Отсутствие типа файла
ET_REL 1 Перемещаемый объектный файл
ET_EXEC 2 Исполняемый файл
ET_DYN 3 Динамическая библиотека
ET_CORE 4 Дамп памяти
ET_LOPROC 0xff00 Назначение зависит от процессора
ET_HIPROC 0xffff Назначение зависит от процессора

Таблица заголовков программы

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

  • Тип сегмента и действия операционной системы с данным сегментом.
  • Расположение сегмента.
  • Точка входа сегмента.
  • Размер сегмента.
  • Флаги доступа к сегменту (запись, чтение, выполнение).

Информация, содержащаяся в этой таблице, представляет интерес для ядра системы, так как указывает ему, как собрать образ процесса из сегментов.

Структура таблицы заголовков программы

Некоторые возможные значения поля p_type

Значение Символьное имя Описание
PT_NULL Неиспользуемая запись
1 PT_LOAD Сегмент программы, загружаемый в память
2 PT_DYNAMIC Информация для динамического связывания
3 PT_INTERP Загрузчик программ
4 PT_NOTE Дополнительная информация
5 PT_PHDR Информация о таблице заголовков программы

Таблица заголовков секций

Таблица заголовков секций характеризует секции файла. Таблица секций является обязательной для компоновщика и необязательной для системного загрузчика. Компоновщик комбинирует секции с похожими атрибутами и оптимальным образом размещает их по сегментам при сборке файла.

Структура таблицы заголовков секций

Имя секции задает смещение данных в секции, индекс которой задается в поле e_shstrndx заголовка ELF-файла. По этому смещению размещается строка, оканчивающаяся нулевым байтом, являющаяся именем секции.

Возможные значения поля sh_type

Значение Символьное имя Описание
SHT_NULL Пустой заголовок секции
1 SHT_PROGBITS Секции программы (например, код или данные)
2 SHT_SYMTAB Таблица символов
3 SHT_STRTAB Таблица строк
4 SHT_RELA Данные о перемещаемых адресах
5 SHT_HASH Хэш-таблица имен для динамического связывания
6 SHT_DYNAMIC Информация для динамического связывания
7 SHT_NOTE Дополнительная информация
8 SHT_NOBITS Признак того, что секция занимает место в адресном пространстве процесса
9 SHT_REL Дополнительные данные о перемещаемых адресах

Утилиты

Существует множество утилит для работы с файлами elf, основные из них содержатся в наборе программных инструментов GNU Binutils:

  • elfedit — обновляет заголовок файла ELF.
  • objdump — показывает информацию об объектных файлах (в том числе и ELF).
  • readelf — показывает подробную информацию о файле.
  • elfutils — предоставляет альтернативные инструменты для GNU Binutils только для Linux.
  • elfdump — команда для просмотра ELF информации в файле ELF, доступна в Solaris и FreeBSD.

Загрузка исполняемого файла в память

При загрузке исполняемого файла в память ELF-заголовок по-умолчанию проецируется по адресу 8048000h, который прописан в его заголовке [Источник 3] . Это базовый адрес загрузки, который может быть изменен на стадии компоновки. Все сегменты проецируются в память в соответствии с виртуальными адресами, прописанными в таблице сегментов, причем виртуальная проекция сегментов всегда непрерывна.

Начиная с адреса 40000000h располагаются совместно используемые библиотеки. Например, ld-linux.so, libm.so и libc.so (ближайший аналог в Windows — kernel32.dll, реализующая Win32 API). За вызов функций операционной системы напрямую отвечает прерывание INT 80h.

Последний гигабайт адресного пространства от адреса C0000000h занимают код и данные операционной системы, к которым можно обращаться посредством прерывания INT 80h или через разделяемые библиотеки. Стек находится в нижних адресах. Он начинается с базового адреса загрузки и увеличивается по направлению к нулевым адресам.

Источник

Adblock
detector