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

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

5 ответов


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

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


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

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

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

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

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

--> проходит через pre-processor

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

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

--> для того чтобы дать агрегат код

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

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

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

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

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


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

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

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

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

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

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

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

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

они содержат машинный код, который может быть непосредственно загружен в память (загрузчиком, e.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.


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

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

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


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