Что такое объектный файл в C? - PullRequest
120 голосов
/ 11 октября 2011

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

Ответы [ 5 ]

128 голосов
/ 11 октября 2011

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

67 голосов
/ 11 октября 2011
  1. Объектный файл - это сам скомпилированный файл.Нет никакой разницы между ними.

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

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

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

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

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

-> для выдачи оптимизированного кода, все еще в C

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

-> toдать ассемблерный код

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

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

-> проходит через компоновщик

-> для получения исполняемого файла.

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

24 голосов
/ 12 августа 2015

Существует 3 вида объектных файлов.

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

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

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

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

Общие объектные файлы

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

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

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

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

Бонус:

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

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

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

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

10 голосов
/ 11 октября 2011

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

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

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

1 голос
/ 13 июля 2013

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

...