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

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


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

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


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

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

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

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

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

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

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

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

-> для передачи кода сборки

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

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

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

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

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

Поделиться
отредактировал 10 октября 2011 в 22:49
ответил 10 окт. в 21:01
  • 5
    Оптимизированный код не создается ни на этапе препроцессора, ни сразу после него. Препроцессор имеет дело только со своим языком и все. Оптимизация происходит на этапах компиляции и сборки. — Ignas2526 05 апр. ’14 в 14:01
  • 1
    Объектный файл, который мы получаем после компиляции, такой же, как исполняемый файл на машинном языке. Я запутался, потому что вы сказали, что объектный файл создается на втором шаге от последнего, а последний шаг — это исполняемый файл. Итак, файл .0, который мы получаем после компиляции, является исполняемым файлом? — AV94 08 сен. ’16 в 6:08
  • не может ли отдельный объектный файл быть исполняемым? — Дорогая 20 июл 2018 в 12:51
добавить комментарий |

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

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

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

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

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

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

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

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

-> для передачи кода сборки

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

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

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

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

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


36

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

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

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

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

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

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

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

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

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

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

Бонусное чтение:

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

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

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

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

Поделиться
отредактировано 20 июня ’20 в 9:12
Сообщество ♦
111 серебряных значков
ответил 12 августа ‘ 15, 19:45
добавить комментарий |

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

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

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

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

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

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

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

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

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

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

Бонусное чтение:

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

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

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

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


11

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

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

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

Поделиться
ответил 10 октября 2011 в 20:34
добавить комментарий |

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

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

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


2

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

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

Поделиться
отредактировал 23 июля ’19 в 15:50
Robert Houghton
58066 серебряных знаков1515 бронзовых знаков
ответил 13 июля ’13 в 0:44
добавить комментарий |

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

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

Оцените статью
Botgadget.ru
Добавить комментарий