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

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

6 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

После того, как компилятор C++ включил все заголовочные файлы и расширил их, он может скомпилировать программу, превратив исходный код в файл объектного кода, который содержит только двоичную версию (грубо говоря, машинный код) исходного кода. Также, например, если в вашей программе было 3 файла cpp, компилятор генерирует 3 объектных файла.

Другие вопросы по тегам