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

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

Ответ 1

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

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

Ответ 2

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

  • Исполняемый файл формируется путем связывания файлов Object.

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

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

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

- > проходит через предварительный процессор

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

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

- > , чтобы получить код сборки

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

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

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

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

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

Ответ 3

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

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

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

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

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

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

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

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

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

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

Бонус:

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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