Что такое "объект" в "объектном файле" и почему он называется так?
Мне задали вопрос: "Что такое" объектный файл "?".
После просмотра Wiki я знаю только, что он содержит объекты.
Но что это за объекты и почему их так называли?
Ответы
Ответ 1
Объектные файлы (или объектный код) - это файлы машинного кода, сгенерированные компилятором из исходного кода.
Разница с исполняемым файлом заключается в том, что объектный файл не связан, поэтому ссылки на функции, символы и т.д. еще не определены (их адреса памяти в основном оставлены пустыми).
При компиляции файла C с помощью GCC:
gcc -Wall -o test test.c
Здесь вы компилируете ссылку И. Таким образом, вы получите исполняемый файл, содержащий все ссылки на адреса памяти для содержащихся в нем символов (библиотеки, заголовки и т.д.).
Но когда вы это сделаете:
gcc -Wall -o test.o -c test.c
Вы создадите файл объекта. Это также машинный код, но он должен быть связан для создания исполняемого файла или библиотеки.
Если у вас есть проект со многими файлами C (например), вы скомпилируете каждый из них в объектный код, а затем вы соедините все объектные файлы вместе, чтобы создать конечный продукт.
Например:
gcc -Wall -o foo.o -c foo.c // Object file for foo.c
gcc -Wall -o bar.o -c bar.c // Object file for bar.c
gcc -Wall -o main.o -c main.c // Object file for main.c
gcc -Wall -o software foo.o bar.o main.o // Executable (foo + bar + main)
Термин объект стоит здесь для последовательностей несвязанного машинного кода (в основном).
Объектный файл содержит объекты.
Вы спросили: почему это так. Я не могу ответить. Почему "синий" называется "синий"?; )
Это просто термин, используемый с... ну, десятилетия...
Для информации, документация по внутренним документам GCC определяет только объектный код как:
"Исходный код" для работы означает предпочтительную форму работы для внесения в нее изменений. "Код объекта" означает любую не-исходную форму работы.
Довольно расплывчатый об исторической причине...
Я просто надеюсь, что теперь вы лучше поймете, что такое объектный файл. Я думаю, что это более важно, чем знать, почему это так называется, поскольку слова - это просто, ну, слова...
Ответ 2
Я считаю, что имя имеет какое-то отношение к тому, чтобы сделать различие между:
- код для людей - исходный код
- код для машин - код объекта
Файлы объектов содержат:
- Информация заголовка: общая информация о файле, такая как размер кода, имя исходного файла, с которого он был переведен, и дата создания.
- Код объекта: двоичные инструкции и данные, сгенерированные компилятором или ассемблером.
- Перемещение: список мест в объектном коде, которые необходимо устранить, когда компоновщик изменяет адреса объектного кода.
- Символы: глобальные символы, определенные в этом модуле, символы, которые должны быть импортированы из других модулей или определены компоновщиком.
- Отладочная информация: Другая информация об объектном коде, которая не нужна для связи, а используется для отладчика. Это включает исходный файл и информация о номере линии, локальные символы, описания данных структуры, используемые объектным кодом, такие как определения структуры C.
Источник: здесь
Ответ 3
Объектный файл представляет собой двоичное представление исходного (текстового) файла. Это набор различных разделов, разделяющих тип данных в:
- текстовый раздел
- раздел данных
- Стек
- куча
В зависимости от вашего компилятора/среды они могут отличаться.
например. on * nix:
objdump -d a.out < --- предоставить, мы скомпилировали a.cpp
disassembly of section .init:
08048278 <_init>:
8048278: 55 push %ebp
8048279: 89 e5 mov %esp,%ebp
804827b: 83 ec 08 sub $0x8,%esp
804827e: e8 61 00 00 00 call 80482e4 <call_gmon_start>
8048283: e8 b3 00 00 00 call 804833b <frame_dummy>
8048288: e8 9f 01 00 00 call 804842c <__do_global_ctors_aux>
804828d: c9 leave
804828e: c3 ret
Disassembly of section .plt:
08048290 <[email protected]>:
8048290: ff 35 78 95 04 08 pushl 0x8049578
8048296: ff 25 7c 95 04 08 jmp *0x804957c
804829c: 00 00 add %al,(%eax)
...
080482a0 <[email protected]>:
80482a0: ff 25 80 95 04 08 jmp *0x8049580
80482a6: 68 00 00 00 00 push $0x0
80482ab: e9 e0 ff ff ff jmp 8048290 <_init+0x18>
080482b0 <[email protected]>:
80482b0: ff 25 84 95 04 08 jmp *0x8049584
80482b6: 68 08 00 00 00 push $0x8
80482bb: e9 d0 ff ff ff jmp 8048290 <_init+0x18>
Disassembly of section .text:
Различные команды вызова здесь затем нравятся различным библиотекам для вызова фактических функций.
Ответ 4
В соответствии со связанной вами страницей Каждая последовательность или объект обычно содержит инструкции для хост-машины для выполнения какой-либо задачи, возможно, сопровождаемой связанными данными и метаданными (например, информация о перемещении, информация о разворачивании стека, комментарии, символы программы, отладка или профилирующей информации).
В принципе, каждый объект в объектном файле является функцией, а соответствующая информация для компоновщика включает его в полную программу.