Что такое "объект" в "объектном файле" и почему он называется так?

Мне задали вопрос: "Что такое" объектный файл "?".

После просмотра 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

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

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