stringtranslate.com

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

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

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

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

Термин «объектная программа» появился как минимум в 1950-х годах:

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

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

Форматы объектных файлов

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

Некоторые системы различают форматы, которые являются непосредственно исполняемыми, и форматы, которые требуют обработки компоновщиком . Например, OS/360 и последующие версии называют первый формат загрузочным модулем , а второй — объектным модулем . В этом случае файлы имеют совершенно разные форматы. [2] DOS и Windows также имеют разные форматы файлов для исполняемых файлов и объектных файлов, например Portable Executable для исполняемых файлов и COFF для объектных файлов в 32- и 64-разрядных Windows.

Unix и Unix-подобные системы использовали один и тот же формат для исполняемых и объектных файлов, начиная с оригинального формата a.out . Некоторые форматы могут содержать машинный код для разных процессоров, при этом правильный выбирается операционной системой при загрузке программы. [3] [4]

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

Библиотека двоичных файловых дескрипторов проекта GNU ( библиотека BFD) предоставляет общий API для работы с объектными файлами в различных форматах.

Абсолютные файлы

Многие ранние компьютеры или небольшие микрокомпьютеры поддерживают только абсолютный формат объектов. Программы неперемещаемы; их необходимо собирать или компилировать для выполнения по определенным, предопределенным адресам. Файл не содержит информации о перемещении или связях. Эти файлы могут быть загружены в память для чтения/записи или сохранены в памяти только для чтения . Например, монитор Motorola 6800 MIKBUG содержит процедуру для чтения абсолютного объектного файла ( формат SREC ) с бумажной ленты . [5] Файлы DOS COM являются более поздним примером абсолютных объектных файлов. [6]

Сегментация

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

Типы данных, поддерживаемые типичными форматами объектных файлов: [7]

Сегменты в разных объектных файлах могут быть объединены компоновщиком в соответствии с правилами, указанными при определении сегментов. Существуют соглашения для сегментов, совместно используемых объектными файлами; например, в DOS существуют различные модели памяти , которые определяют имена специальных сегментов и то, могут ли они быть объединены. [8]

Формат отладочных данных отладочной информации может быть либо неотъемлемой частью формата объектного файла, как в COFF , либо полунезависимым форматом, который может использоваться с несколькими форматами объектов, такими как stabs или DWARF .

Смотрите также

Ссылки

  1. ^ Врубель, Маршал Х. (1959). Учебник программирования для цифровых компьютеров. Нью-Йорк, США: McGraw-Hill . С. 222. Получено 31 июля 2020 г.
  2. ^ IBM OS Linkage Editor and Loader (PDF) . IBM Corporation . 1973. стр. 16. Получено 06.08.2012 .
  3. ^ "Универсальные двоичные файлы и двоичные файлы PowerPC 32-bit/64-bit". Справочник формата файла OS X ABI Mach-O . Apple Inc. 2009-02-04 [2003]. Архивировано из оригинала 2014-09-04.
  4. ^ "FatELF: Универсальные двоичные файлы для Linux" . Получено 2020-08-02 .
  5. ^ Уайлс, Майк; Феликс, Андре. MCM6830L7 MIKBUG/MINIBUG ROM (PDF) . Motorola Semiconductor Products, Inc . Получено 2020-07-31 .
  6. ^ Годзе, Дипали А.; Годзе, Атул П. (2008). Микропроцессор (1-е изд.). Пуна, Индия: Технические публикации. стр. 3–15. ISBN 978-81-8431-355-0.
  7. ^ Мауэрер, Вольфганг (2010). "Приложение E. Двоичный формат ELF". Профессиональная архитектура ядра Linux . John Wiley & Sons . стр. Приложение E. ISBN 978-0-470-34343-2. Получено 2020-08-01 .
  8. ^ Ирвин, Кип Р. (1993). Язык ассемблера для IBM-PC (2-е изд.). Нью-Йорк, США: Macmillan. ISBN 0-02-359651-1.

Дальнейшее чтение