Объектный файл представляет собой компьютерный файл , содержащий объектный код , то есть, машинный код выход на ассемблере или компилятор . Код объекта обычно перемещаемый , и обычно не непосредственно исполняемый файл . Существуют различные форматы объектных файлов, и один и тот же машинный код может быть упакован в разные форматы объектных файлов. Объектный файл может также работать как разделяемая библиотека .
Помимо самого объектного кода, объектные файлы могут содержать метаданные, используемые для связывания или отладки, в том числе: информацию для разрешения символьных перекрестных ссылок между различными модулями, информацию о перемещении, информацию о раскручивании стека , комментарии , символы программы , информацию об отладке или профилировании .
Термин «объектная программа» появился как минимум в 1950-х годах:
Термин в автоматическом программировании для программы на машинном языке, созданной машиной путем перевода исходной программы, написанной программистом, на язык, похожий на алгебраическую нотацию. [1]
Программист генерирует объектный код с помощью компилятора . Например, под Linux GNU Compiler Collection компилятор будет генерировать файлы , которые имеют расширение .o и использовать ELF формат. В Windows они имеют расширение .obj и используют формат COFF . Затем компоновщик используется для объединения объектного кода в одну исполняемую программу или библиотеку, при необходимости извлекая предварительно скомпилированные системные библиотеки. Напротив, сценарии ( Python или JavaScript ) интерпретируются, а программы Java (язык программирования) компилируются в файлы классов с байтовым кодом.
Форматы объектных файлов
Есть много различных форматов объектных файлов; Первоначально каждый тип компьютера имел свой собственный уникальный формат, но с появлением Unix и других переносимых операционных систем некоторые форматы, такие как COFF и ELF , были определены и использовались в различных типах систем. Один и тот же формат файла может использоваться как в качестве ввода и вывода компоновщика , так и в качестве формата библиотеки и исполняемого файла. [2] : стр. 16 Некоторые форматы могут содержать машинный код для разных процессоров, причем правильный код выбирается операционной системой при загрузке программы. [3]
Некоторые системы делают различие между файлами, которые являются непосредственно исполняемыми, и файлами, которые требуют обработки компоновщиком. Например, OS / 360 и ее последователи называют первый формат загрузочным модулем, а второй - объектным модулем . В этом случае файлы имеют совершенно разные форматы.
Дизайн и / или выбор формата объектного файла является ключевой частью общего дизайна системы. Это влияет на производительность линкера и , таким образом , программисту поворот в то время как программа разрабатывается. Если формат используется для исполняемых файлов, дизайн также влияет на время, необходимое для запуска программ , и, следовательно, на скорость отклика для пользователей.
Абсолютные объектные файлы
Многие ранние компьютеры или небольшие микрокомпьютеры поддерживают только абсолютный объектный формат. Программы не могут быть перемещены; они должны быть собраны или скомпилированы для выполнения по определенным заранее определенным адресам. Файл не содержит информации о перемещении или привязке. Эти файлы могут быть загружены в память для чтения / записи или сохранены в постоянной памяти . Например, монитор Motorola 6800 MIKBUG содержит процедуру для чтения абсолютного объектного файла ( формат SREC ) с бумажной ленты . [4] COM-файлы DOS являются более поздним примером абсолютных объектных файлов. [5]
Сегментация
Большинство форматов объектных файлов структурированы как отдельные разделы данных, каждый из которых содержит определенный тип данных. Эти разделы известны как «сегменты» из-за термина « сегмент памяти », который ранее был распространенной формой управления памятью . Когда программа загружается в память загрузчиком , загрузчик выделяет программе различные области памяти. Некоторые из этих областей соответствуют сегментам объектного файла и поэтому обычно известны под одними и теми же именами. Другие, например стек, существуют только во время выполнения. В некоторых случаях перемещение выполняется загрузчиком (или компоновщиком) для указания фактических адресов памяти. Однако для многих программ или архитектур в перемещении нет необходимости, поскольку оно выполняется блоком управления памятью или независимым от позиции кодом . В некоторых системах сегменты объектного файла затем могут быть скопированы (выгружены) в память и выполнены без необходимости дальнейшей обработки. В этих системах это может выполняться лениво , то есть только тогда, когда на сегменты ссылаются во время выполнения, например, через отображаемый в память файл, поддерживаемый объектным файлом.
Типы данных, поддерживаемые типичными форматами объектных файлов: [6]
- Заголовок (описательная и контрольная информация)
- Сегмент кода («текстовый сегмент», исполняемый код)
- Сегмент данных (инициализированные статические переменные )
- Сегмент данных только для чтения ( родата , инициализированные статические константы )
- Сегмент BSS (неинициализированные статические данные, как переменные, так и константы)
- Внешние определения и ссылки для ссылки
- Информация о переезде
- Динамическая компоновка информации
- Отладочная информация
Сегменты в разных объектных файлах могут быть объединены компоновщиком в соответствии с правилами, указанными при определении сегментов. Существуют соглашения для сегментов, совместно используемых объектными файлами; например, в DOS существуют разные модели памяти, которые определяют имена специальных сегментов и то, могут ли они быть объединены. [7]
Отладочная информация может быть либо неотъемлемой частью формата файла объекта, как и в COFF , или полунезависимое формат , который может быть использован с несколькими форматами объектов, таких как уколов или DWARF .
Проект GNU «s Binary библиотека Descriptor File (библиотека BFD) обеспечивает общий API для манипуляции объектных файлов в различных форматах.
Рекомендации
- ^ Врубель, маршал Х. (1959). Учебник по программированию для цифровых компьютеров . Нью-Йорк: Макгроу-Хилл. п. 222 . Проверено 31 июля 2020 года .
- ^ Корпорация IBM (1973). IBM OS Linkage Editor and Loader (PDF) . Проверено 6 августа 2012 .
- ^ «FatELF: универсальные двоичные файлы для Linux» . Проверено 2 августа 2020 года .
- ^ Уайлс, Майк; Феликс, Андре. MCM6830L7 ПЗУ MIKBUG / MINIBUG (PDF) . Motorola Semiconductor Products, Inc . Проверено 31 июля 2020 года .
- ^ Godse, DA; Годсе, AP (2008). Микропроцессор - I (Первое изд.). Пуна: Технические публикации. С. 3–15. ISBN 978-81-8431-355-0.
- ^ Мауэрер, Вольфганг (2010). Профессиональная архитектура ядра Linux . Джон Вили и сыновья. п. Приложение E: Двоичный формат ELF. ISBN 978-0-470-34343-2. Проверено 1 августа 2020 года .
- ^ Ирвин, Кип Р. (1993), Ассемблер для IBM-PC (2-е изд.), Нью-Йорк: Macmillan, ISBN 0-02-359651-1
дальнейшее чтение
- Левин, Джон Р. (2000). Линкеры и загрузчики . Издательство Морган Кауфманн. п. 256. ISBN 1-55860-496-0.