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


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

5 99

5 ответов:

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

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

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

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

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

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

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

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

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

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

--> дать сборку код

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

--> дать код на машинном языке, который хранится в объектных файлах

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

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

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

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

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

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

полный процесс будет: препроцессор (cpp) будет работать над a. c. его выход (все еще источник) будет подаваться в компилятор (СС1). Его выход (сборка) будет подаваться в ассемблер (as), который будет производить 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 - > ld1)

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

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

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

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

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