Что такое объектный файл в C?


148

Я читаю о библиотеках на C, но еще не нашел объяснения, что такое объектный файл. В чем реальная разница между любым другим скомпилированным файлом и объектным файлом?
Буду рад, если кто-нибудь сможет объяснить на человеческом языке.



Ответы:


161

Объектный файл - это реальный результат этапа компиляции. В основном это машинный код, но есть информация, которая позволяет компоновщику видеть, какие символы в нем есть, а также символы, необходимые для работы. (Для справки, «символы» - это в основном имена глобальных объектов, функций и т. Д.)

Компоновщик берет все эти объектные файлы и объединяет их в один исполняемый файл (при условии, что это возможно, т. Е. Что нет никаких повторяющихся или неопределенных символов). Многие компиляторы сделают это за вас (читай: они запускают компоновщик самостоятельно), если вы не скажете им «просто компилировать» с помощью параметров командной строки. ( -cэто распространенный вариант "просто компилировать; не связывать".)


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

18
@ChrisDodd: Это часто случалось со старыми компиляторами. В наши дни компилятор не будет генерировать код сборки, если вы его не попросите, и часто не использует его для внутренних целей. Но в любом случае сборка будет подэтапом фазы компиляции, так что все это спорный вопрос.
cHao

2
может ли отдельный объектный файл быть исполняемым?
Honey

2
@ Мед: Как правило, нет. Даже если объектный файл был в формате, предназначенном для выполнения (чего в принципе никогда не бывает), то часть о «символах, которые необходимы для работы» в основном убивает сделку. Даже ваш стандартный «привет, мир» требует компоновки с библиотекой времени выполнения C.
cHao

77
  1. Объектный файл - это сам скомпилированный файл. Между ними нет разницы.

  2. Исполняемый файл формируется путем связывания объектных файлов.

  3. Объектный файл содержит инструкции низкого уровня, понятные процессору. Вот почему его еще называют машинным кодом.

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

Вот типичный высокоуровневый поток для этого процесса для кода на языке высокого уровня, таком как C

-> проходит препроцессор

-> чтобы дать оптимизированный код, все еще на C

-> проходит через компилятор

-> предоставить код сборки

-> проходит через ассемблер

-> предоставить код на машинном языке, который хранится в ФАЙЛАХ ОБЪЕКТОВ

-> проходит через линкер

-> получить исполняемый файл.

Этот поток может иметь некоторые вариации, например, большинство компиляторов могут напрямую генерировать код машинного языка, не используя ассемблер. Точно так же они могут сделать за вас предварительную обработку. Тем не менее, для лучшего понимания неплохо разбить составные части.


5
Оптимизированный код не создается ни на этапе препроцессора, ни сразу после него. Препроцессор имеет дело только со своим языком и все. Оптимизация происходит на этапах компиляции и сборки.
Ignas2526

Объектный файл, который мы получаем после компиляции, такой же, как исполняемый файл на машинном языке. Я запутался, потому что вы сказали, что объектный файл создается на втором шаге от последнего, а последний шаг - это исполняемый файл. Итак, файл .0, который мы получаем после компиляции, является исполняемым файлом?
AV94 08

не может ли отдельный объектный файл быть исполняемым?
Honey

34

Есть 3 вида объектных файлов.

Перемещаемые объектные файлы

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

Если у вас есть a.c исходный файл, чтобы создать его объектный файл с помощью GCC, вы должны запустить: gcc a.c -c

Полный процесс будет выглядеть следующим образом: препроцессор (cpp) будет работать через переменный ток. Его вывод (все еще исходный) будет передан в компилятор (cc1). Его вывод (сборка) будет передан ассемблеру (as), который создаст файл relocatable object file. Этот файл содержит объектный код и ссылки (и отладку, если-g метаданные использовались) и не является исполняемым напрямую.

Файлы общих объектов

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

Исполняемые объектные файлы

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

Результатом выполнения компоновщика нескольких файлов relocatable object filesявляется файл executable object file. Компоновщик объединяет все входные объектные файлы из командной строки слева направо, объединяя все входные разделы одного типа (например, .data) с выходными разделами того же типа. Он использует symbol resolutionи relocation.

Бонусное чтение:

При связывании с a static libraryфункции, на которые есть ссылки во входных объектах, копируются в окончательный исполняемый файл. С dynamic librariesтаблицей символов создаются вместо этого даст возможность динамического связывания с библиотечными функциями / глобал. Таким образом, результатом является частично исполняемый объектный файл, так как он зависит от библиотеки. Если библиотека не существует, файл больше не может выполняться).

Процесс связывания может быть выполнен следующим образом: ld a.o -o myexecutable

Команда: gcc a.c -o myexecutableвызовет все команды, упомянутые в точке 1 и в точке 3 (cpp -> cc1 -> as -> ld 1 )

1: на самом деле это collect2, который является оболочкой над ld.


11

Объектный файл - это именно то, что вы получаете, когда компилируете один (или несколько) исходных файлов.

Это может быть либо полностью завершенный исполняемый файл или библиотека, либо промежуточные файлы.

Объектные файлы обычно содержат собственный код, информацию о компоновщике, отладочные символы и т. Д.


2

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

Точно так же, как процессору требуется двоичный код для запуска, объектные файлы похожи на двоичный код, но не связаны. Связывание создает дополнительные файлы, так что пользователю не нужно самостоятельно компилировать язык C. Пользователи могут напрямую открывать exe-файл после того, как объектный файл связан с каким-либо компилятором, например языком c, vb и т. Д.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.