Що таке об’єктний файл у C?


140

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



Відповіді:


153

Об'єктний файл - це реальний вихід з фази компіляції. Це здебільшого машинний код, але має інформацію, яка дозволяє лінкеру бачити, які символи є в ньому, а також символи, які йому потрібні для роботи. (Для довідки, "символи" - це в основному назви глобальних об'єктів, функцій тощо)

Лінкер приймає всі ці об’єктні файли і поєднує їх, щоб утворити один виконуваний файл (припускаючи, що він може, тобто: немає жодних повторюваних або невизначених символів). Дуже багато компіляторів зроблять це за вас (читайте: вони запускають посилання самостійно), якщо ви не скажете їм «просто компілювати», використовуючи параметри командного рядка. ( -cє загальним варіантом "просто компілювати; не посилати".)


Насправді, для більшості компіляторів висновком з етапу компіляції є код складання, а потім компілятор викликає асемблер, щоб перетворити це в файл об'єктів.
Кріс Додд

15
@ChrisDodd: Це часто траплялося зі старими компіляторами. У наші дні компілятор не генерує код складання, якщо ви не попросите його і часто не використовуєте його всередині країни. Але в будь-якому випадку складання було б підфазою фази компіляції, тому все є суперечливим.
cHao

2
чи може бути виконаний один об'єктний файл?
Мед

1
@Honey: Загалом, ні. Навіть якщо файл об'єкта був у форматі, призначеному для виконання (якого він, як правило, ніколи не є), ця частина про "символи, необхідні для роботи", в основному вбиває угоду. Навіть ваш стандартний "привіт світ" вимагає зв'язування з бібліотекою C часу виконання.
cHao

74
  1. Файл об'єкта - це сам скомпільований файл. Різниці між ними немає.

  2. Виконавчий файл формується шляхом з'єднання файлів Object.

  3. Файл об'єкта містить інструкції низького рівня, які можна зрозуміти процесором. Ось чому його ще називають машинним кодом.

  4. Цей машинний код низького рівня являє собою двійкове представлення інструкцій, які ви також можете записати безпосередньо за допомогою мови складання, а потім обробити код мови збірки (представлений англійською мовою) на машинну мову (представлений шістнадцятковою) за допомогою асемблера.

Ось типовий для цього процесу потік високого рівня для коду в мові високого рівня, такому як C

-> проходить через попередній процесор

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

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

-> дати код складання

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

-> надати код машинною мовою, який зберігається у файлах OBJECT

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

-> щоб отримати виконуваний файл.

Цей потік може мати деякі варіанти, наприклад, більшість компіляторів можуть безпосередньо генерувати машинний код мови, не проходячи асемблер. Так само вони можуть зробити попередню обробку за вас. І все-таки приємно розбити складові для кращого розуміння.


5
Оптимізований код не генерується ні на етапі перед процесором, ні відразу після нього. Попередній процесор має справу лише зі своєю мовою, і все. Оптимізація відбувається на етапах складання та складання.
Ignas2526

Це об'єктний файл, який ми отримуємо після компіляції, такий же, як і виконуваний файл машинною мовою. Я збентежений, тому що ви сказали, що об'єктовий файл створюється на другому кроці з останнього та останнього кроку - це виконуваний файл. Отже, файл .0, який ми отримуємо після компіляції, це виконавчий файл?
AV94

чи не може бути виконаний також один об’єктний файл?
Мед

33

Є 3 види файлів об’єктів.

Об'єктні файли, що переміщуються

Містить машинний код у формі, яка може поєднуватися з іншими об'єктами, що переміщуються, під час посилання, щоб сформувати виконуваний об’єктний файл.

Якщо у вас є a.cвихідний файл, для створення його об’єктного файлу за допомогою GCC слід запустити: gcc a.c -c

Повний процес був би: препроцесор (cpp) перебіг би змінного струму. Його вихід (нерухоме джерело) подаватиметься в компілятор (cc1). Його вихід (збірка) подаватиметься в асемблер (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 -> ld 1 )

1: насправді є collection2, яка є обгорткою над ld.


11

Об'єктний файл - це саме те, що ви отримуєте при складанні одного (або декількох) вихідних файлів.

Це може бути повністю завершений виконуваний файл або бібліотека, або проміжні файли.

Об'єктні файли, як правило, містять нативний код, інформацію про зв'язок, символи налагодження тощо.


2

Файли об'єктів - це коди, які залежать від функцій, символів та тексту для запуску програми. Так само, як і старі телексні машини, яким необхідна телетипізація для передачі сигналів іншій телексній машині.

Таким же чином процесор вимагає виконання бінарного коду, об'єктні файли схожі на двійковий код, але не пов'язані між собою. Пов’язання створює додаткові файли, щоб користувачеві не довелося самостійно складати мову С. Користувачі можуть безпосередньо відкрити файл exe, як тільки об’єктний файл пов'язаний з деяким компілятором, наприклад, мовою c, або vb тощо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.