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

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

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

Я получил это из спецификации MS PE & COFF

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

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

В этой главе описывается формат объектного файла, называемый ELF (Executable and Linking Format). Есть три основных типа объектных файлов.

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

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

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

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

Q3. Я знаю, что PE происходит от COFF. Но почему спецификация Microsoft формата PE носит название Microsoft Portable Executable and Common Object File Format Specification. Они по-прежнему поддерживают COFF? Если они, то в какой ОС? Я давно думал, что PE полностью заменил COFF.


person claws    schedule 31.01.2010    source источник
comment
При втором чтении я не совсем уверен, в чем ваш вопрос - вы спрашиваете, в чем разница между PE, COFF и ELF, как работает связывание / загрузка и как разрешаются адреса, или что-то еще?   -  person Michael Burr    schedule 31.01.2010
comment
Я разделил свой вопрос на 2 вопроса: другой вопрос по VA & RVA - stackoverflow.com/questions/2170843/   -  person claws    schedule 31.01.2010
comment
@Michael Burr: 1. Меня смущают различия в терминологии object file & Image file, используемых в спецификациях PE / COFF и ELF. 2. Придерживаясь указанной выше терминологии object file & Image file, object files также находятся в формате PE / COFF (в Windows) и формате ELF (в Linux)?   -  person claws    schedule 31.01.2010
comment
@ Майкл Берр: Это ты опубликовал ответ и удалил его? Если это вы, пожалуйста, повторно отправьте ответ, так как он четко относится к моей первой части запроса.   -  person claws    schedule 31.01.2010
comment
@claws: Я восстановил свой ответ. Но для справки я сначала удалил его, потому что, похоже, он в основном повторял информацию, которую вы содержали в своем вопросе, а не отвечал на него.   -  person Michael Burr    schedule 31.01.2010
comment
@Michael Burr: Мой пост просто Clarification (см. Заголовок) :). Просто хотел убедиться, что правильно понял. : D   -  person claws    schedule 31.01.2010


Ответы (5)


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

Это "Обычно" терминология.

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

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

    1. Static Library (*.lib files for windows. *.a for 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).
  • Я не знаю, есть ли в заголовке бит, который отличает файл объекта от файла изображения. Это нужно проверить.

Я знаю, что PE происходит от COFF. Но почему в спецификациях Microsoft формат PE называется Microsoft Portable Executable "и Common Object File Format Specification". Они по-прежнему поддерживают COFF? Если они, то в какой ОС? Я давно думал, что PE полностью заменил COFF.

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

person Community    schedule 03.02.2010
comment
Фактически, используется ли термин модуль для описания загруженного PE-образа, зависит от контекста. Это общий термин в загрузчике изображений в пользовательском режиме, потому что имеет смысл описывать символьные зависимости между EXE и DLL или между двумя DLL в терминах зависимостей между модулями. Однако с точки зрения диспетчера памяти режима ядра (при описании объектов разделов и сегментов) загруженные изображения по-прежнему называются просто изображениями, потому что нет смысла описывать сопоставления памяти в условия модулей - person Erlend Graff; 06.04.2015
comment
Похоже, что одна из ссылок на изображение мертва, кто-нибудь знает, что это за изображение раньше? Не могу найти на archive.org. - person jrh; 23.03.2021

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

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

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

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

person Michael Burr    schedule 31.01.2010

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

person Justin Smith    schedule 31.01.2010

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

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

person R Samuel Klatchko    schedule 31.01.2010
comment
классно!! это ценная информация. Вы знаете, похожий ли случай и с PE? - person claws; 31.01.2010
comment
Да, это видно из этого документа (microsoft.com/whdc/system/ platform / firmware / PECOFF.mspx), что PE делает нечто подобное (в начале объектного файла или сразу после подписи файла изображения находится стандартный заголовок файла COFF). - person R Samuel Klatchko; 31.01.2010
comment
Я не имел в виду заголовок PE. Я знаю, что у PE-файла есть заголовок. Я спрашивал о таком флаге. Есть ли у PE какой-либо флаг, который отличает ObjectFile от ImageFile. - person claws; 04.02.2010

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

person user281446    schedule 26.02.2010