Разъяснения по форматам и терминологии двоичных файлов (PE / COFF & ELF) - PullRequest
13 голосов
/ 31 января 2010

Я немного путаю в терминологии.

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

Я получил это из "MS PE & COFF Specification"

Q1. Файл изображения также называется Binary Image, Binary File или просто Binary. Правильно?

Q2. Таким образом, согласно приведенной выше терминологии, PE / ELF / COFF являются форматами файла изображения , а не объектного файла. право? Но http://www.sco.com/developers/gabi/latest/ch4.intro.html говорит

В этой главе описывается формат объектного файла, называемый ELF (Исполняемый и связующий формат). Существует три основных типа объектных файлов.

  • Перемещаемый файл содержит код и данные, подходящие для связи с другими объектные файлы для создания исполняемого файла или общий объектный файл.

  • Исполняемый файл содержит программу, подходящую для выполнения; файл определяет, как exec (BA_OS) создает образ процесса программы.

  • Общий объектный файл содержит код и данные, подходящие для связывания, в двух контексты. Во-первых, редактор ссылок [см. ld (BA_OS)] обрабатывает общий объект файл с другими перемещаемыми и общими объектные файлы для создания другого объекта файл. Во-вторых, динамический компоновщик объединяет его с исполняемым файлом и другие общие объекты для создания образ процесса.

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

Q3. Я знаю, что PE происходит от COFF. Но почему спецификации Microsoft формата PE названы Microsoft Portable Executable "и Спецификация формата общего объектного файла" . Они все еще поддерживают COFF? Если они, то в какой ОС? Я думал, что PE полностью заменил COFF давно.

Ответы [ 5 ]

14 голосов
/ 04 февраля 2010

Я ОП. Каждый ответ является частичным ответом. Итак, я комбинирую все остальные ответы с тем, что я узнал, чтобы завершить ответ.

Это используемая терминология " Обычно ".

  • Файл, который передается в качестве входных данных компоновщику (вывод ассемблера), называется Object File или Relocatable File.

  • Компоновщик создает Image file, который, в свою очередь, используется как ввод загрузчиком. Теперь Image file может быть Executable file или Library file. Эти «библиотечные файлы» бывают двух видов:

    1. Статическая библиотека (* .lib файлы для Windows. * .A для Linux)
    2. Общие / динамические библиотеки: DLL (* .dll в Windows) & Shared Object file (* .so в Linux)
  • Термин Binary File / Binary может использоваться для обозначения либо ObjectFile, либо ImageFile. Понять в зависимости от контекста. Это очень общий термин.

  • Загрузчик при загрузке файла изображения в память. Затем он называется Module (я не уверен насчет парней из Linux, но парни из Windows называют его Module

http://www.gliffy.com/pubdoc/1978433/L.jpg альтернативный текст http://www.gliffy.com/pubdoc/1978433/L.jpg

Как я уже сказал, это " Обычно " используемая терминология. Не существует строгих определений для терминов «двоичный файл», «файл изображения» или «объектный файл».

В частности, термин «объектный файл» может иногда использоваться для обозначения промежуточного файла, выводимого компилятором для использования компоновщиком, но в другом контексте может означать исполняемый файл.

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

  • И ObjectFile, и ImageFile имеют формат PE в Windows и формат ELF в Linux.
  • ELF - это не только формат файла изображения, но и формат объектного файла.
  • Каждый файл ELF начинается с заголовка ELF. Второе поле заголовка ELF - e_type; это поле позволяет нам узнать, является ли файл объектным файлом (иначе говоря, перемещаемым на языке ELF), или изображением (которое может быть как исполняемым, так и общим объектом) или чем-то еще (файлы ядра также являются файлами ELF).
  • Я не знаю, есть ли бит в заголовке, который отличает объектный файл от файла изображения. Это нужно проверить.
* * 1068

Я знаю, что ПЭ происходит от КОФ. Но почему Microsoft спецификации формата PE назван Microsoft Portable Executable "и Общий формат объектного файла Спецификация ". Они все еще поддерживают COFF? Если они, то в какой ОС? я думал ЧП давно полностью заменил COFF.

Что касается "PE" против "COFF", я помню, что Microsoft использует спецификацию "COFF" в качестве отправной точки для спецификации "PE", но расширяет ее для своих нужд. Строго говоря, файл PE не является файлом COFF, но во многих отношениях он очень похож.

2 голосов
/ 31 января 2010

Нет строгих определений для терминов «двоичный файл», «файл изображения» или «объектный файл».

В частности, термин «объектный файл» может иногда использоваться для обозначения промежуточного файла, выводимого компилятором для использования компоновщиком, но в другом контексте может означать исполняемый файл.

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

Что касается "PE" против "COFF", я помню, что Microsoft использует спецификацию "COFF" в качестве отправной точки для спецификации "PE", но расширяет ее для своих нужд. Строго говоря, файл PE не является файлом COFF, но во многих отношениях он очень похож.

1 голос
/ 31 января 2010

В отношении Q2 для ELF, ELF - это не только формат файла изображения, но и также формат объектного файла.

Каждый файл ELF начинается с Заголовок ELF . Второе поле заголовка ELF - e_type; это поле позволяет нам узнать, является ли файл объектным файлом (иначе говоря, перемещаемым на языке ELF), изображением (которое может быть как исполняемым, так и общим объектом) или чем-то еще (файлы ядра также являются файлами ELF).

1 голос
/ 31 января 2010

gcc -c создаст файл .o, который является объектным файлом формата elf, в системе Linux. «ELF 32-битный LSB с возможностью перемещения, Intel 80386, версия 1 (SYSV)» - это описание файла .o командой file на моем компьютере.

0 голосов
/ 26 февраля 2010

Кроме того, я знаю, что дампы ядра в Solaris (и я предполагаю, что другие разновидности Unix) могут быть в формате ELF.

...