Я читаю про бібліотеки на С, але ще не знайшов пояснення щодо того, що таке об’єктний файл. Яка реальна різниця між будь-яким іншим складеним файлом та об’єктним файлом?
Я був би радий, якби хтось міг пояснити людською мовою.
Я читаю про бібліотеки на С, але ще не знайшов пояснення щодо того, що таке об’єктний файл. Яка реальна різниця між будь-яким іншим складеним файлом та об’єктним файлом?
Я був би радий, якби хтось міг пояснити людською мовою.
Відповіді:
Об'єктний файл - це реальний вихід з фази компіляції. Це здебільшого машинний код, але має інформацію, яка дозволяє лінкеру бачити, які символи є в ньому, а також символи, які йому потрібні для роботи. (Для довідки, "символи" - це в основному назви глобальних об'єктів, функцій тощо)
Лінкер приймає всі ці об’єктні файли і поєднує їх, щоб утворити один виконуваний файл (припускаючи, що він може, тобто: немає жодних повторюваних або невизначених символів). Дуже багато компіляторів зроблять це за вас (читайте: вони запускають посилання самостійно), якщо ви не скажете їм «просто компілювати», використовуючи параметри командного рядка. ( -c
є загальним варіантом "просто компілювати; не посилати".)
Файл об'єкта - це сам скомпільований файл. Різниці між ними немає.
Виконавчий файл формується шляхом з'єднання файлів Object.
Файл об'єкта містить інструкції низького рівня, які можна зрозуміти процесором. Ось чому його ще називають машинним кодом.
Цей машинний код низького рівня являє собою двійкове представлення інструкцій, які ви також можете записати безпосередньо за допомогою мови складання, а потім обробити код мови збірки (представлений англійською мовою) на машинну мову (представлений шістнадцятковою) за допомогою асемблера.
Ось типовий для цього процесу потік високого рівня для коду в мові високого рівня, такому як C
-> проходить через попередній процесор
-> для надання оптимізованого коду, все ще в С
-> проходить через компілятор
-> дати код складання
-> проходить через асемблер
-> надати код машинною мовою, який зберігається у файлах OBJECT
-> проходить через Linker
-> щоб отримати виконуваний файл.
Цей потік може мати деякі варіанти, наприклад, більшість компіляторів можуть безпосередньо генерувати машинний код мови, не проходячи асемблер. Так само вони можуть зробити попередню обробку за вас. І все-таки приємно розбити складові для кращого розуміння.
Є 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.
Файли об'єктів - це коди, які залежать від функцій, символів та тексту для запуску програми. Так само, як і старі телексні машини, яким необхідна телетипізація для передачі сигналів іншій телексній машині.
Таким же чином процесор вимагає виконання бінарного коду, об'єктні файли схожі на двійковий код, але не пов'язані між собою. Пов’язання створює додаткові файли, щоб користувачеві не довелося самостійно складати мову С. Користувачі можуть безпосередньо відкрити файл exe, як тільки об’єктний файл пов'язаний з деяким компілятором, наприклад, мовою c, або vb тощо.