Создание мужественных файлов
Для создания программ разработчики преобразовывают исходный код в объектные файлы. Объектные файлы тогда упаковываются в исполняемый код или статические библиотеки. OS X включает инструменты для преобразования исходного кода в запущенное приложение или совместно используемую библиотеку, которой могут пользоваться одно или более приложений.
Эта статья свободно описывает, как создаются приложения Mac, и обсуждает, подробно, типы программ, которые можно создать. Это описывает инструменты, вовлеченные в Мужественный процесс сборки файла, объясняют типы Мужественных файлов, которые Вы можете создать и говорите о модулях, которые являются самым маленьким связываемым модулем кода и данных в среде выполнения OS X. Это также описывает статические архивные библиотеки, которые являются файлами тот пакет ряд модулей.
Инструменты — создание и петляние
Для выполнения работы фактической загрузки и привязки программы во время выполнения ядро использует динамического компоновщика (специально отмеченная динамическая совместно используемая библиотека, расположенная в /usr/lib/dyld
). Ядро загружает программу и динамического компоновщика в новый процесс и выполняет их.
Всюду по этому документу следующие инструменты обсуждены абстрактно:
Компилятор является инструментом, переводящим из исходного кода, записанного в высокоуровневом языке в промежуточные объектные файлы, содержащие двоичный код машины и данные. Если не указано иное эта книга полагает, что ассемблер машинного языка компилятор.
Статический компоновщик является инструментом, комбинирующим промежуточные объектные файлы в конечные продукты (см. продукты — Типы Мужественных Файлов, которые Можно Создать).
Инструменты XCode CD содержат несколько инструментов командной строки (к которому относится этот документ коллективно как стандартные инструменты) для создания и анализа Вашего приложения, включая компиляторы и ld
, типичный статический компоновщик. Используете ли Вы приложение XCode, стандартные инструменты командной строки или сторонний комплект инструментальных средств для разработки приложения, понимая, что роль каждого из следующих инструментов может улучшить понимание Мужественной архитектуры среды выполнения и упростить коммуникацию об этих темах с другими разработчиками OS X. Стандартные инструменты включают следующее:
Драйвер компилятора,
/usr/bin/gcc
, содержит поддержку компиляции, сборки и соединения модулей исходного кода от C, C++ и языков Objective C. Драйвер компилятора вызывает несколько других инструментов, реализующих фактическую компиляцию, сборку и функциональность статического подключения. Фактические инструменты компилятора для каждого диалекта языка обычно скрыты от представления драйвером компилятора; их роль должна преобразовать входной исходный код в ассемблер для ввода к ассемблеру.Драйвер компилятора C++,
/usr/bin/c++
, походит/usr/bin/cc
но автоматически функции времени выполнения C++ ссылок в выходной файл (для поддержки исключений, информации о типах во время выполнения и других усовершенствованных функций языка).Ассемблер,
/usr/bin/as
, создает промежуточные объектные файлы из кода ассемблера. Это прежде всего используется драйвером компилятора, подающим его источник ассемблера, сгенерированный фактическим компилятором.Статический компоновщик,
/usr/bin/ld
, используется драйвером компилятора (и как автономный инструмент) для объединения Мужественных исполняемых файлов. Можно использовать статического компоновщика для привязки программ или статически или динамично. Статически связанные программы являются полными системами в и себя; они не могут выполнить вызовы, кроме системных вызовов, к платформам или совместно использованным библиотекам. В то время как все другие типы программы динамично связываются, даже традиционный UNIX и инструменты командной строки BSD, в OS X статически связываются расширения ядра. Все вызовы к ядру OS X программами вне ядра выполняются через совместно используемые библиотеки, и только динамично связанные программы могут получить доступ к совместно использованным библиотекам.Инструмент создания библиотеки,
/usr/bin/libtool
, создает или статические архивные библиотеки или динамические совместно используемые библиотеки, в зависимости от данных параметров.libtool
заменяет более старый вызванный инструментranlib
, который использовался в сочетании сar
инструмент для создания статических библиотек. Когда здание совместно использовало библиотеки,libtool
вызывает статического компоновщика (ld
).
Инструменты для анализа Мужественных файлов включают следующее:
/usr/bin/lipo
инструмент позволяет Вам создавать и анализировать двоичные файлы, содержащие изображения больше чем для одной архитектуры. Примером такого двоичного файла является универсальный двоичный файл. Универсальные двоичные файлы могут использоваться в основанных на PowerPC и основанных на Intel компьютерах Macintosh. Другим примером является двоичный файл PPC/PPC64, который может использоваться в 32-разрядных основанных на PowerPC и 64-разрядных основанных на PowerPC компьютерах Macintosh.Инструмент отображения типа файла,
/usr/bin/file
, показывает тип файла. Для файлов мультиархитектуры это показывает тип каждого из изображений, составляющих архив.Инструмент отображения объектного файла,
/usr/bin/otool
, перечисляет содержание определенных разделов и сегментов в Мужественном файле. Это включает символьные дизассемблеры для каждой поддерживаемой архитектуры, и это знает, как отформатировать содержание многих общих типов раздела.Инструмент анализа страницы,
/usr/bin/pagestuff
, информация о дисплеях на каждой логической странице, которые составляют изображение, включая имена разделов и символов, содержавшихся в каждой странице. Этот инструмент не работает над двоичными файлами, содержащими изображения больше чем для одной архитектуры.Инструмент дисплея таблицы символов,
/usr/bin/nm
, позволяет Вам просматривать содержание таблицы символов объектного файла.
Продукты — типы мужественных файлов можно создать
В OS X типовое приложение выполняет код, происходящий из многих типов файлов. Основной исполняемый файл обычно содержит логику ядра программы, включая точку входа main
функция. Основная функциональность программы обычно реализуется в коде основного исполняемого файла. Посмотрите Выполняющиеся Мужественные Файлы для подробных данных. Другие файлы, содержащие исполняемый код, включают:
Промежуточные объектные файлы. Эти файлы не являются конечными продуктами; они - основные стандартные блоки больших объектных файлов. Обычно, компилятор создает один промежуточный объектный файл на выводе для кода и данных, сгенерированных от каждого входного файла исходного кода. Можно тогда использовать статического компоновщика для объединения объектных файлов в динамических компоновщиков. Интегрированные среды разработки, такие как XCode обычно скрывают этот уровень детализации.
Динамические совместно используемые библиотеки. Это файлы, содержащие модули допускающего повторное использование исполняемого кода, что Ваши ссылки приложения динамично и которые загружаются динамическим компоновщиком, когда запускается приложение. Совместно используемыми библиотеками обычно пользуются для хранения больших объемов кода, которые применимы многими приложениями. Посмотрите пользующиеся Совместно используемые Библиотеки и Платформы в Загружающемся Коде во Время выполнения для получения дополнительной информации.
Платформы. Это каталоги, содержащие совместно используемые библиотеки и связанные ресурсы, такие как графические файлы, документация разработчика и интерфейсы программирования. Посмотрите пользующиеся Совместно используемые Библиотеки и Платформы в Загружающемся Коде во Время выполнения для получения дополнительной информации.
Платформы зонтика. Это специальные типы платформ, самих содержащих больше чем одну подплатформу. Например, платформа защиты Какао содержит Набор Приложения (классы пользовательского интерфейса) платформа и Основа (классы непользовательского интерфейса) платформа. Посмотрите пользующиеся Совместно используемые Библиотеки и Платформы в Загружающемся Коде во Время выполнения для получения дополнительной информации.
Статические архивные библиотеки. Эти файлы содержат модули повторно используемого кода, который статический компоновщик может добавить к Вашему приложению во время изготовления. Статические архивные библиотеки обычно содержат очень мелкие суммы кода, которые применимы только к нескольким приложениям или коду, который трудно поддержать в совместно используемой библиотеке по некоторым причинам. Посмотрите Статические Архивные Библиотеки для получения дополнительной информации.
Пакеты. Это исполняемые файлы, которые Ваша программа может загрузить во время выполнения с помощью функций динамического подключения. Пакеты реализуют сменную функциональность, такую как средства импорта формата файла для текстового процессора. Термин пакет имеет два связанных значения в OS X:
Файл фактического объекта, содержащий исполняемый код
Каталог, содержащий объектный файл и связанные ресурсы. Например, приложения в OS X упаковываются как пакеты. И, потому что эти пакеты выведены на экран в Средстве поиска как единственный файл вместо как каталог, комплекты приложений также известны как пакеты приложений. Пакет не должен содержать объектный файл. Для получения дополнительной информации о пакетах см. Руководство по программированию Пакета.
Последнее использование является более общим. Однако если не указано иное этот документ относится к прежнему.
Посмотрите Загружающийся Сменный Код С Пакетами в Загружающемся Коде во Время выполнения для получения дополнительной информации.
Расширения ядра статически связываются Мужественные файлы, упаковывающиеся так же к пакетам. Расширения ядра загружаются в адресное пространство ядра и должны поэтому быть созданы по-другому, чем другие Мужественные типы файлов; см. документацию ядра для получения дополнительной информации. Среда выполнения ядра очень отличается со времени выполнения пространства пользователя, таким образом, это не охвачено в этом документе.
Для функционирования должным образом в OS X все объектные файлы кроме расширений ядра должны быть динамично связаны — т.е. созданы с кодом, позволяющим динамические ссылки на совместно используемые библиотеки.
По умолчанию статический компоновщик ищет платформы и платформы зонтика в /System/Library/Frameworks
и для совместно используемых библиотек и статических архивных библиотек в /usr/lib
. Пакеты обычно располагаются в Resources
каталог пакета приложений. Однако можно указать путь для различного расположения во время ссылки (и, в целях разработки, во время выполнения также).
Модули — самый маленький модуль кода
На высшем уровне можно просмотреть совместно использованную библиотеку OS X как набор модулей. Модуль является самым маленьким модулем машинного кода и данных, которые могут быть соединены независимо от других модулей кода. Обычно, модуль является объектным файлом, сгенерированным путем компиляции единственного исходного файла C. Например, учитывая исходные файлы main.c
, thing.c
, и foo.c
, компилятор мог бы генерировать объектные файлы main.o
, thing.o
, и foo.o
. Каждый из этих выходных объектных файлов является одним модулем. Когда статический компоновщик используется для объединения всех трех файлов в динамическую совместно используемую библиотеку, каждый из объектных файлов сохраняется как отдельный модуль кода и данных. При соединении приложений и пакетов, статический компоновщик всегда комбинирует все объектные файлы в один модуль.
Статический компоновщик может также сократить несколько входных модулей в единственный модуль. При создании самых динамических совместно используемых библиотек это обычно - хорошая идея сделать, это прежде, чем создать финал совместно использовало библиотеку, потому что вызовы функции между модулями подвергаются мелкой сумме дополнительных издержек. С ld
, можно выполнить эту оптимизацию при помощи командной строки следующим образом:
ld -r -o things.o thing1.o thing2.o thing3.o |
XCode выполняет эту оптимизацию по умолчанию.
Статические архивные библиотеки
Для группировки ряда модулей можно пользоваться статической архивной библиотекой, которая является архивным файлом с записью оглавления. Формат - используемый ar
команда. Можно использовать libtool
команда для создания статической архивной библиотеки, и можно использовать ar
команда для управления отдельными модулями в библиотеке.
В дополнение к Мужественным файлам статический компоновщик и другие средства разработки принимают статические архивные библиотеки, как введено. Вы могли бы пользоваться статической архивной библиотекой для распределения ряда модулей, которые Вы не хотите включать в совместно используемую библиотеку, но что Вы хотите сделать доступным для многократных программ.
Несмотря на то, что ar
архив может содержать любой тип файла, типичная цель состоит в том, чтобы собрать в группу несколько объектных файлов с оглавлением, формируя статическую архивную библиотеку. Статический компоновщик может соединить объектные файлы, хранившие в статической архивной библиотеке в Мужественную исполнимую или динамическую библиотеку. Обратите внимание на то, что необходимо использовать libtool
команда для создания статического оглавления библиотеки перед архивом может использоваться в качестве статической архивной библиотеки.
ar
формат архивного файла описан в OS X ABI Мужественная Ссылка Формата файла.
Со стандартными инструментами можно передать -static
опция к libtool
создать статическую архивную библиотеку. Следующая команда создает статическую архивную названную библиотеку libthing.a
от ряда промежуточных объектных файлов, thing1.o
и thing2.o
:
libtool -static thing1.o thing2 -o libthing.a |
Обратите внимание на то, что, если Вы не передаете ни одного -static
ни -dynamic
, libtool
принимает -static
. Это, однако, считают хорошим стилем для явной передачи -static
при создании статических архивных библиотек.
Для получения дополнительной информации посмотрите libtool
и ar
страницы справочника.