OS X ABI мужественная ссылка формата файла
Этот документ описывает структуру Мачо (объект Маха) формат файла, который является стандартом, используемым для хранения программ и библиотек по диску в двоичном интерфейсе приложения (ABI) Mac. Чтобы понять, как инструменты Xcode работают с Мужественными файлами, и выполнять низкоуровневые задачи отладки, необходимо понять эту информацию.
Мужественный формат файла обеспечивает оба промежуточных звена (во время процесса сборки) и финал (после соединения конечного продукта) хранение машинного кода и данных. Это было разработано как гибкая замена для BSD a.out
формат, чтобы использоваться компилятором и статическим компоновщиком и содержать статически соединенный исполняемый код во время выполнения. Опции динамического подключения были добавлены как цели развитого OS X, приведя к единственному формату файла и для статически соединенного и для динамично соединенного кода.
Базовая структура
Мужественный файл содержит три главных области (как показано на рисунке 1):
В начале каждого Мужественного файла структура заголовка, идентифицирующая файл как Мужественный файл. Заголовок также содержит другую основную информацию о типе файла, указывает целевую архитектуру и содержит флаги, указывающие опции, влияющие на интерпретацию остальной части файла.
Непосредственно после заголовка ряд команд загрузки переменного размера, указывающих характеристики расположения и связи файла. Среди другой информации команды загрузки могут указать:
Начальное расположение файла в виртуальной памяти
Расположение таблицы символов (используемый для динамического подключения)
Начальный режим выполнения основного потока программы
Имена совместно используемых библиотек, содержащих определения для импортированных символов основной исполнимой программы
После команд загрузки все Мужественные файлы содержат данные одного или более сегментов. Каждый сегмент содержит нуль или больше разделов. Каждый раздел сегмента содержит код или данные некоторого определенного типа. Каждый сегмент определяет область виртуальной памяти, которую динамический компоновщик отображает в адресное пространство процесса. Точное число и расположение сегментов и разделов указаны командами загрузки и типом файла.
На пользовательском уровне полностью соединил Мужественные файлы, последний сегмент является сегментом редактирования ссылки. Этот сегмент содержит таблицы информации о редактировании ссылки, такие как таблица символов, таблица строк, и т.д, используемый динамическим загрузчиком для соединения исполняемого файла или Мужественного пакета к его зависимым библиотекам.
Различные таблицы в Мужественном файле относятся к разделам числом. Нумерация раздела начинается в 1 (не 0) и продолжается через границы сегмента. Таким образом первый сегмент в файле может содержать разделы 1 и 2, и второй сегмент может содержать разделы 3 и 4.
При использовании Ударов, отлаживая формат, таблица символов также содержит отладочную информацию. При использовании DWARF отладочная информация сохранена в соответствующем dSYM файле изображения, указанном uuid_command
структура
Структура заголовка и команды загрузки
Мужественный файл содержит код и данные для одной архитектуры. Структура заголовка Мужественного файла указывает целевую архитектуру, позволяющую ядру гарантировать, что, например, код, предназначенный для основанных на PowerPC компьютеров Macintosh, не выполняется на основанных на Intel компьютерах Macintosh.
Можно сгруппировать многократные Мужественные файлы (один для каждой архитектуры, которую Вы хотите поддерживать) в одном двоичном файле с помощью формата, описанного в Универсальных Двоичных файлах и 32-bit/64-bit Двоичных файлах PowerPC.
К сегментам и разделам обычно получают доступ по имени. Сегменты, условно, называют с помощью всех прописных букв, которым предшествуют два подчеркивания (например, __TEXT
); разделы нужно назвать с помощью всех строчных букв, которым предшествуют два подчеркивания (например, __text
). Это соглашение о присвоении имен является стандартным, несмотря на то, что не требуемый для инструментов работать правильно.
Сегменты
Сегмент определяет диапазон байтов в Мужественном файле и адресах и атрибутах защиты памяти, в которых те байты отображаются в виртуальную память, когда динамический компоновщик загружает приложение. Также, сегменты всегда являются выровненной страницей виртуальной памяти. Сегмент содержит нуль или больше разделов.
Сегменты, требующие большего количества памяти во время выполнения, чем, они делают во время изготовления, может указать большее в емкости памяти, чем они фактически имеют на диске. Например, __PAGEZERO
сегмент, сгенерированный компоновщиком для исполняемых файлов PowerPC, имеет размер виртуальной памяти одной страницы, но дисковый размер 0. Поскольку __PAGEZERO
не содержит данных, нет никакой потребности в нем для занятия любого места в исполняемом файле.
Для компактности промежуточный объектный файл содержит только один сегмент. Этот сегмент не имеет никакого имени; это содержит все разделы, предназначенные в конечном счете для различных сегментов в файле конечного объекта. Структура данных, определяющая a section
содержит имя сегмента, для которого предназначается раздел, и статический компоновщик помещает каждый раздел в файл конечного объекта соответственно.
Для лучшей производительности сегменты должны быть выровненные на границах страницы виртуальной памяти — 4 096 байтов для PowerPC и x86 процессоров. Для вычисления размера сегмента сложите размер каждого раздела, затем окружите сумму к следующей границе страницы виртуальной памяти (4 096 байтов или 4 килобайта). Используя этот алгоритм, минимальный размер сегмента составляет 4 килобайта, и после того это измерено в 4-килобайтных инкрементах.
Заголовок и команды загрузки считают частью первого сегмента файла в целях разбивки на страницы. В исполняемом файле это обычно означает, что заголовки и команды загрузки живут в начале __TEXT
сегмент, потому что это - первый сегмент, содержащий данные. __PAGEZERO
сегмент не содержит данных по диску, таким образом, это проигнорировано с этой целью.
Это сегменты, которые стандартные средства разработки OS X (содержавшийся в Инструментах XCode CD) могут включать в исполнимую программу OS X:
Статический компоновщик создает a
__PAGEZERO
сегмент как первый сегмент исполняемого файла. Этот сегмент расположен в расположении виртуальной памяти 0 и не имеет никаких присвоенных прав защиты, комбинация которого вызывает доступы кNULL
, общая программная ошибка C, для непосредственного катастрофического отказа.__PAGEZERO
сегмент является размером одной полной страницы VM для текущей архитектуры (для основанных на Intel и основанных на PowerPC компьютеров Macintosh, это - 4 096 байтов или шестнадцатеричных 0x1000 дюймов). Поскольку нет никаких данных в__PAGEZERO
сегмент, это не занимает места в файле (размер файла в команде сегмента 0).__TEXT
сегмент содержит исполняемый код и другие данные только для чтения. Чтобы позволить ядру отображать его непосредственно от исполнимой программы в совместно используемую память, статический компоновщик устанавливает полномочия виртуальной памяти этого сегмента запретить запись. Когда сегмент отображается в память, он может быть совместно использован среди всех процессов, заинтересованных ее содержанием. (Это прежде всего используется с платформами, пакетами и совместно используемыми библиотеками, но возможно выполнить многократные копии той же исполнимой программы в OS X, и это применяется в этом случае также.) Атрибут «только для чтения» также означает, что страницы, составляющие__TEXT
сегмент никогда не должен записываться обратно к диску. Когда ядро должно высвободить физическую память, оно может просто отбросить один или больше__TEXT
страницы и перечитанный их от диска, когда они затем необходимы.__DATA
сегмент содержит перезаписываемые данные. Статический компоновщик устанавливает полномочия виртуальной памяти этого сегмента позволить и чтение и запись. Поскольку это перезаписываемо,__DATA
сегмент платформы или другой совместно используемой библиотеки логически копируется для каждого процесса, соединяющегося с библиотекой. Когда страницы памяти, такие как те, которые составляют__DATA
сегмент читаем и перезаписываем, ядро отмечает их копия на записи; поэтому, когда процесс пишет в одну из этих страниц, тот процесс получает свою собственную частную копию страницы.__OBJC
сегмент содержит данные, используемые библиотекой поддержки во время выполнения языка Objective C.__IMPORT
сегмент содержит тупики символа и неленивые указатели на символы, не определенные в исполнимой программе. Этот сегмент сгенерирован только для исполнимых программ, предназначенных для архитектуры IA-32.__LINKEDIT
сегмент содержит необработанные данные, используемые динамическим компоновщиком, такие как символ, строка и записи таблицы перемещения.
Разделы
__TEXT
и __DATA
сегменты могут содержать много стандартных разделов, перечисленных в Таблице 1, Таблице 2 и Таблице 3. __OBJC
сегмент содержит много разделов, которые являются частными к компилятору Objective C. Обратите внимание на то, что статический компоновщик и аналитические инструменты файла используют тип раздела и атрибуты (вместо имени раздела), чтобы определить, как они должны обработать раздел. Имя раздела, введите, и атрибуты объяснены далее в описании section
тип данных.
Сегмент и имя раздела |
Содержание |
---|---|
|
Исполнимый машинный код. Компилятор обычно помещает только исполняемый код в этот раздел, никакие таблицы или данные любого вида. |
|
Постоянные струны до. Струна до является последовательностью ненулевых байтов, заканчивающейся нулевым байтом ( |
|
Позиционно-независимые косвенные тупики символа. См. “Позиционно-независимый Код” в Мужественных Темах Программирования для получения дополнительной информации. |
|
Косвенные тупики символа. См. “Позиционно-независимый Код” в Мужественных Темах Программирования для получения дополнительной информации. |
|
Инициализированные постоянные переменные. Компилятор помещает все неперемещаемые объявленные данные |
|
4-байтовые литеральные значения. Компилятор помещает константы плавающей точки одинарной точности в этот раздел. Статический компоновщик объединяет эти значения, удаляя копии, при создании конечного продукта. С некоторой архитектурой более эффективно для компилятора использовать непосредственные инструкции загрузки вместо того, чтобы добавить к этому разделу. |
|
8-байтовые литеральные значения. Компилятор помещает константы плавающей точки двойной точности в этот раздел. Статический компоновщик объединяет эти значения, удаляя копии, при создании конечного продукта. С некоторой архитектурой более эффективно для компилятора использовать непосредственные инструкции загрузки вместо того, чтобы добавить к этому разделу. |
Сегмент и имя раздела |
Содержание |
---|---|
|
Инициализированные непостоянные переменные, такие как перезаписываемые струны до и массивы данных. |
|
Ленивые указатели символа, которые являются косвенными ссылками на функции, импортированные из различного файла. См. “Позиционно-независимый Код” в Мужественных Темах Программирования для получения дополнительной информации. |
|
Неленивые указатели символа, которые являются косвенными ссылками на элементы данных, импортированные из различного файла. См. “Позиционно-независимый Код” в Мужественных Темах Программирования для получения дополнительной информации. |
|
Раздел Placeholder используется динамическим компоновщиком. |
|
Инициализированные перемещаемые постоянные переменные. |
|
Функции инициализации модуля. Компилятор C++ размещает статических конструкторов сюда. |
|
Функции завершения модуля. |
|
Данные для неинициализированных статических переменных (например, |
|
Неинициализированные импортированные определения символа (например, |
-
Указывает общие атрибуты файла. Появляется в начале объектных файлов, предназначенных к 32-разрядной архитектуре. Объявленный в
/usr/include/mach-o/loader.h
. См. такжеmach_header_64
.Объявление
Objective C
struct mach_header { uint32_t magic; cpu_type_t cputype; cpu_subtype_t cpusubtype; uint32_t filetype; uint32_t ncmds; uint32_t sizeofcmds; uint32_t flags; };
Поля
magic
Целое число, содержащее значение, идентифицирующее этот файл как 32-разрядный Мужественный файл. Используйте константу
MH_MAGIC
если файл предназначается для использования на CPU с тем же порядком байтов как компьютер, на котором работает компилятор. КонстантаMH_CIGAM
когда схема порядка байтов целевой машины является реверсом узла CPU, может использоваться.cputype
Целое число, указывающее архитектуру, Вы намереваетесь использовать файл на. Надлежащие значения включают:
CPU_TYPE_POWERPC
предназначаться для основанных на PowerPC компьютеров MacintoshCPU_TYPE_I386
предназначаться для основанных на Intel компьютеров Macintosh
cpusubtype
Целое число, указывающее точную модель CPU. Для работы всего PowerPC или x86 процессоров, поддерживаемых ядром OS X, это должно быть установлено в
CPU_SUBTYPE_POWERPC_ALL
илиCPU_SUBTYPE_I386_ALL
.filetype
Целое число, указывающее использование и выравнивание файла. Допустимые значения для этого поля включают:
MH_OBJECT
тип файла является форматом, используемым для промежуточных объектных файлов. Это - очень компактный формат, содержащий все его разделы в одном сегменте. Компилятор и ассемблер обычно создают тотMH_OBJECT
файл для каждого файла исходного кода. Условно, расширение файла для этого формата.o
.MH_EXECUTE
тип файла является форматом, используемым стандартными исполняемыми программами.MH_BUNDLE
тип файла является типом, обычно используемым кодом, который Вы загружаете во время выполнения (обычно вызванные пакеты или плагины). Условно, расширение файла для этого формата.bundle
.MH_DYLIB
тип файла для динамических совместно используемых библиотек. Это содержит некоторые дополнительные таблицы для поддержки многократных модулей. Условно, расширение файла для этого формата.dylib
, за исключением основной совместно используемой библиотеки платформы, обычно не имеющей расширения файла.MH_PRELOAD
тип файла является форматом исполняемых файлов, используемым для программ специального назначения, не загружающихся ядром OS X, таким как программы врезался в программируемые микросхемы ROM. Не путайте этот тип файла сMH_PREBOUND
флаг, который является флагом, который статический компоновщик устанавливает в структуре заголовка для маркировки предсвязанного изображения.MH_CORE
тип файла используется, чтобы хранить базовые файлы, традиционно создающиеся, когда отказывает программа. Базовые файлы хранят все адресное пространство процесса в то время, когда оно отказало. Можно позже работатьgdb
на базовом файле для выяснения, почему произошел катастрофический отказ.MH_DYLINKER
тип файла является типом совместно использованной библиотеки динамического компоновщика. Это - типdyld
файл.MH_DSYM
тип файла определяет файлы, хранящие информацию символа для соответствующего двоичного файла.
ncmds
Целое число, указывающее число команд загрузки после структуры заголовка.
sizeofcmds
Целое число, указывающее число байтов, занятых командами загрузки после структуры заголовка.
flags
Целое число, содержащее ряд битовых флагов, указывающих состояние определенных дополнительных функций Мужественного формата файла. Это маски, которые можно использовать для управления этим полем:
MH_NOUNDEFS
— Объектный файл не содержал неопределенных ссылок, когда он был создан.MH_INCRLINK
— Объектный файл является выводом инкрементной ссылки против основного файла и не может быть соединен снова.MH_DYLDLINK
— Файл вводится для динамического компоновщика и не может быть статически соединен снова.MH_TWOLEVEL
— Изображение использует двухуровневую привязку пространства имен.MH_BINDATLOAD
— Когда файл загружается, динамический компоновщик должен связать неопределенные ссылки.MH_PREBOUND
— Неопределенные ссылки файла предварительно связываются.MH_PREBINDABLE
— Этот файл не предварительно связывается, но мог восстановить свою предварительную привязку. Используемый только, когдаMH_PREBEOUND
не установлен.MH_NOFIXPREBINDING
— Динамический компоновщик не уведомляет предобязательный агент об этой исполнимой программе.MH_ALLMODSBOUND
— Указывает, что этот двоичный файл связывает со всеми двухуровневыми модулями пространства имен его зависимых библиотек. Используемый только, когдаMH_PREBINDABLE
иMH_TWOLEVEL
установлены.MH_CANONICAL
— Этот файл был каноническим unprebinding — очищающий предобязательную информацию от файла. Посмотритеredo_prebinding
страница справочника для подробных данных.MH_SPLIT_SEGS
— Файл имеет свое только для чтения и разделение сегментов чтения-записи.MH_FORCE_FLAT
— Исполнимая программа вынуждает все изображения использовать плоскую привязку пространства имен.MH_SUBSECTIONS_VIA_SYMBOLS
— Разделы объектного файла могут быть разделены на отдельные блоки. Эти блоки мертво разделяются, если они не используются другим кодом. Посмотрите Соединение для подробных данных.MH_NOMULTIDEFS
— Этот зонтик гарантирует, что нет никаких повторных определений символов в его подызображениях. В результате двухуровневые подсказки пространства имен могут всегда использоваться.
Доступность
Доступный в OS X v10.6 и позже.
-
Определяет общие атрибуты файла, предназначенного для 64-разрядной архитектуры. Объявленный в
/usr/include/mach-o/loader.h
.Объявление
Objective C
struct mach_header_64 { uint32_t magic; cpu_type_t cputype; cpu_subtype_t cpusubtype; uint32_t filetype; uint32_t ncmds; uint32_t sizeofcmds; uint32_t flags; uint32_t reserved; };
Поля
magic
Целое число, содержащее значение, идентифицирующее этот файл как 64-разрядный Мужественный файл. Используйте константу
MH_MAGIC_64
если файл предназначается для использования на CPU с тем же порядком байтов как компьютер, на котором работает компилятор. КонстантаMH_CIGAM_64
когда схема порядка байтов целевой машины является реверсом узла CPU, может использоваться.cputype
Целое число, указывающее архитектуру, Вы намереваетесь использовать файл на. Единственное надлежащее значение для этой структуры:
CPU_TYPE_x86_64
предназначаться для 64-разрядных основанных на Intel компьютеров Macintosh.CPU_TYPE_POWERPC64
предназначаться для 64-разрядных основанных на PowerPC компьютеров Macintosh.
cpusubtype
Целое число, указывающее точную модель CPU. Для работы всех процессоров PowerPC, поддерживаемых ядром OS X, это должно быть установлено в
CPU_SUBTYPE_POWERPC_ALL
.filetype
Целое число, указывающее использование и выравнивание файла. Допустимые значения для этого поля включают:
MH_OBJECT
тип файла является форматом, используемым для промежуточных объектных файлов. Это - очень компактный формат, содержащий все его разделы в одном сегменте. Компилятор и ассемблер обычно создают тотMH_OBJECT
файл для каждого файла исходного кода. Условно, расширение файла для этого формата.o
.MH_EXECUTE
тип файла является форматом, используемым стандартными исполняемыми программами.MH_BUNDLE
тип файла является типом, обычно используемым кодом, который Вы загружаете во время выполнения (обычно вызванные пакеты или плагины). Условно, расширение файла для этого формата.bundle
.MH_DYLIB
тип файла для динамических совместно используемых библиотек. Это содержит некоторые дополнительные таблицы для поддержки многократных модулей. Условно, расширение файла для этого формата.dylib
, за исключением основной совместно используемой библиотеки платформы, обычно не имеющей расширения файла.MH_PRELOAD
тип файла является форматом исполняемых файлов, используемым для программ специального назначения, не загружающихся ядром OS X, таким как программы врезался в программируемые микросхемы ROM. Не путайте этот тип файла сMH_PREBOUND
флаг, который является флагом, который статический компоновщик устанавливает в структуре заголовка для маркировки предсвязанного изображения.MH_CORE
тип файла используется, чтобы хранить базовые файлы, традиционно создающиеся, когда отказывает программа. Базовые файлы хранят все адресное пространство процесса в то время, когда оно отказало. Можно позже работатьgdb
на базовом файле для выяснения, почему произошел катастрофический отказ.MH_DYLINKER
тип файла является типом совместно использованной библиотеки динамического компоновщика. Это - типdyld
файл.MH_DSYM
тип файла определяет файлы, хранящие информацию символа для соответствующего двоичного файла.
ncmds
Целое число, указывающее число команд загрузки после структуры заголовка.
sizeofcmds
Целое число, указывающее число байтов, занятых командами загрузки после структуры заголовка.
flags
Целое число, содержащее ряд битовых флагов, указывающих состояние определенных дополнительных функций Мужественного формата файла. Это маски, которые можно использовать для управления этим полем:
MH_NOUNDEFS
— Объектный файл не содержал неопределенных ссылок, когда он был создан.MH_INCRLINK
— Объектный файл является выводом инкрементной ссылки против основного файла и не может быть соединен снова.MH_DYLDLINK
— Файл вводится для динамического компоновщика и не может быть статически соединен снова.MH_TWOLEVEL
— Изображение использует двухуровневую привязку пространства имен.MH_BINDATLOAD
— Когда файл загружается, динамический компоновщик должен связать неопределенные ссылки.MH_PREBOUND
— Неопределенные ссылки файла предварительно связываются.MH_PREBINDABLE
— Этот файл не предварительно связывается, но мог восстановить свою предварительную привязку. Используемый только, когдаMH_PREBEOUND
не установлен.MH_NOFIXPREBINDING
— Динамический компоновщик не уведомляет предобязательный агент об этой исполнимой программе.MH_ALLMODSBOUND
— Указывает, что этот двоичный файл связывает со всеми двухуровневыми модулями пространства имен его зависимых библиотек. Используемый только, когдаMH_PREBINDABLE
иMH_TWOLEVEL
установлены.MH_CANONICAL
— Этот файл был каноническим unprebinding — очищающий предобязательную информацию от файла. Посмотритеredo_prebinding
страница справочника для подробных данных.MH_SPLIT_SEGS
— Файл имеет свое только для чтения и разделение сегментов чтения-записи.MH_FORCE_FLAT
— Исполнимая программа вынуждает все изображения использовать плоскую привязку пространства имен.MH_SUBSECTIONS_VIA_SYMBOLS
— Разделы объектного файла могут быть разделены на отдельные блоки. Эти блоки мертво разделяются, если они не используются другим кодом. См. «Соединение» для подробных данных.MH_NOMULTIDEFS
— Этот зонтик гарантирует, что нет никаких повторных определений символов в его подызображениях. В результате двухуровневые подсказки пространства имен могут всегда использоваться.
reserved
Зарезервированный для будущего использования.
Доступность
Доступный в OS X v10.6 и позже.
Структуры команды загрузки расположены непосредственно после заголовка объектного файла, и они указывают и логическую структуру файла и расположение файла в виртуальной памяти. Каждая команда загрузки начинается с полей, указывающих тип команды и размер данных команды.
-
Содержит поля, которые характерны для всех команд загрузки.
Объявление
Objective C
struct load_command { uint32_t cmd; uint32_t cmdsize; };
Поля
cmd
Целое число, указывающее тип команды загрузки. Таблица 4 перечисляет допустимые типы команды загрузки.
cmdsize
Целое число, указывающее общий размер в байтах структуры данных команды загрузки. Каждая структура команды загрузки содержит различный набор данных, в зависимости от типа команды загрузки, таким образом, у каждого мог бы быть различный размер. В 32-разрядной архитектуре размер должен всегда быть кратным числом 4; в 64-разрядной архитектуре размер должен всегда быть кратным числом 8. Если данные команды загрузки не делятся равномерно на 4 или 8 (в зависимости от того, является ли целевая архитектура 32-разрядной или 64-разрядной, соответственно), добавьте байты, содержащие нули до конца, пока это не делает.
Обсуждение
Таблица 4 перечисляет допустимые типы команды загрузки со ссылками к полным структурам данных для каждого типа.
Табличные 4Mach-O команды загрузки Команды
Структуры данных
Цель
LC_UUID
Указывает 128-разрядный UUID для изображения или его соответствующего dSYM файла.
LC_SEGMENT
Определяет сегмент этого файла, который будет отображен в адресное пространство процесса, загружающего этот файл. Это также включает все разделы, содержавшие сегментом.
LC_SEGMENT_64
Определяет 64-разрядный сегмент этого файла, который будет отображен в адресное пространство процесса, загружающего этот файл. Это также включает все разделы, содержавшие сегментом.
LC_SYMTAB
Указывает таблицу символов для этого файла. Эта информация используется и статическими и динамическими компоновщиками при соединении файла, и также отладчиками для отображения символов на файлы кода первоисточника, от которых были сгенерированы символы.
LC_DYSYMTAB
Указывает дополнительную информацию о таблице символов, используемую динамическим компоновщиком.
LC_THREAD
LC_UNIXTHREAD
Для исполняемого файла,
LC_UNIXTHREAD
команда определяет начальное состояние потока основного потока процесса.LC_THREAD
подобноLC_UNIXTHREAD
но не заставляет ядро выделять штабель.LC_LOAD_DYLIB
Определяет имя динамической совместно используемой библиотеки, против которой соединяется этот файл.
LC_ID_DYLIB
Указывает имя установки динамической совместно используемой библиотеки.
LC_PREBOUND_DYLIB
Для совместно используемой библиотеки, против которой эта исполнимая программа соединяется предварительно связанная, указывает использующиеся модули в совместно используемой библиотеке.
LC_LOAD_DYLINKER
Указывает динамического компоновщика, которого ядро выполняет для загрузки этого файла.
LC_ID_DYLINKER
Идентифицирует этот файл как динамического компоновщика.
LC_ROUTINES
Содержит адрес совместно используемой подпрограммы инициализации библиотеки (указанный компоновщиком
-init
опция).LC_ROUTINES_64
Содержит адрес совместно используемой библиотеки 64-разрядная подпрограмма инициализации (указанный компоновщиком
-init
опция).LC_TWOLEVEL_HINTS
Содержит двухуровневую таблицу подсказки поиска пространства имен.
LC_SUB_FRAMEWORK
Идентифицирует этот файл как реализацию подплатформы платформы зонтика. Имя платформы зонтика сохранено в строковом параметре.
LC_SUB_UMBRELLA
Указывает файл, который является подзонтиком этой платформы зонтика.
LC_SUB_LIBRARY
Определяет атрибуты
LC_SUB_LIBRARY
команда загрузки. Идентифицирует подбиблиотеку этой платформы и отмечает эту платформу как платформу зонтика.LC_SUB_CLIENT
Подплатформа может явно позволить другой платформе или пакету соединяться против него включением
LC_SUB_CLIENT
команда загрузки, содержащая имя платформы или имени клиента для пакета.Доступность
Доступный в OS X v10.6 и позже.
-
Указывает 128-разрядный универсально уникальный идентификатор (UUID) для изображения или для его соответствующего dSYM файла.
Объявление
Objective C
struct uuid_command { uint32_t cmd; uint32_t cmdsize; uint8_t uuid[16]; };
Поля
cmd
Набор к
LC_UUID
для этой структуры.cmdsize
Набор к
sizeof(uuid_command)
.uuid
128-разрядный уникальный идентификатор.
Доступность
Доступный в OS X v10.6 и позже.
-
Указывает диапазон байтов в 32-разрядном Мужественном файле, составляющих сегмент. Те байты отображаются загрузчиком в адресное пространство программы. Объявленный в
/usr/include/mach-o/loader.h
. См. такжеsegment_command_64
.Объявление
Objective C
struct segment_command { uint32_t cmd; uint32_t cmdsize; char segname[16]; uint32_t vmaddr; uint32_t vmsize; uint32_t fileoff; uint32_t filesize; vm_prot_t maxprot; vm_prot_t initprot; uint32_t nsects; uint32_t flags; };
Поля
cmd
Характерный для всех структур команды загрузки. Набор к
LC_SEGMENT
для этой структуры.cmdsize
Характерный для всех структур команды загрузки. Для этой структуры, набор это поле к
sizeof(segment_command)
плюс размер всех структур данных раздела, следующих (sizeof(segment_command + (sizeof(section) * segment->nsect))
).segname
Струна до, указывающая имя сегмента. Значение этого поля может быть любой последовательностью символов ASCII, несмотря на то, что имена сегмента, определенные Apple, начинаются с двух подчеркиваний и состоят из прописных букв (как в
__TEXT
и__DATA
). Это поле фиксируется в 16 байтах в длине.vmaddr
Указывает стартовый адрес виртуальной памяти этого сегмента.
vmsize
Указывает число байтов виртуальной памяти, занятой этим сегментом. См. также описание
filesize
, ниже.fileoff
Указывает смещение в этом файле данных, которые будут отображены в
vmaddr
.filesize
Указывает число байтов, занятых этим сегментом на диске. Для сегментов, требующих большего количества памяти во время выполнения, чем, они делают во время изготовления,
vmsize
может быть больше, чемfilesize
. Например,__PAGEZERO
сегмент, сгенерированный компоновщиком дляMH_EXECUTABLE
файлы имеют avmsize
из 0x1000, но afilesize
из 0. Поскольку__PAGEZERO
не содержит данных, нет никакой потребности в нем для занятия любого места до времени выполнения. Кроме того, статический компоновщик часто выделяет неинициализированные данные в конце__DATA
сегмент; в этом случае,vmsize
больше, чемfilesize
. Загрузчик гарантирует, что любая память этого вида инициализируется с нулями.maxprot
Указывает максимальные разрешенные меры защиты виртуальной памяти этого сегмента.
initprot
Указывает начальные меры защиты виртуальной памяти этого сегмента.
nsects
Указывает число структур данных раздела после этой команды загрузки.
flags
Определяет ряд флагов, влияющих на загрузку этого сегмента:
SG_HIGHVM
— Содержание файла для этого сегмента для высокой части пространства виртуальной памяти; низкая часть является заполненным нулем (для штабелей в базовых файлах).SG_NORELOC
— Этот сегмент не имеет ничего, что было перемещено в нем и ничто перемещенное к нему. Это может быть безопасно заменено без перемещения.
Доступность
Доступный в OS X v10.6 и позже.
-
Указывает диапазон байтов в 64-разрядном Мужественном файле, составляющих сегмент. Те байты отображаются загрузчиком в адресное пространство программы. Если 64-разрядный сегмент имеет разделы, они определяются
section_64
структуры. Объявленный в/usr/include/mach-o/loader.h
.Объявление
Objective C
struct segment_command_64 { uint32_t cmd; uint32_t cmdsize; char segname[16]; uint64_t vmaddr; uint64_t vmsize; uint64_t fileoff; uint64_t filesize; vm_prot_t maxprot; vm_prot_t initprot; uint32_t nsects; uint32_t flags; };
Поля
cmd
См. описание в
segment_command
. Набор кLC_SEGMENT_64
для этой структуры.cmdsize
Характерный для всех структур команды загрузки. Для этой структуры, набор это поле к
sizeof(segment_command_64)
плюс размер всех структур данных раздела, следующих (sizeof(segment_command_64 + (sizeof(section_64) * segment->nsect))
).segname
Струна до, указывающая имя сегмента. Значение этого поля может быть любой последовательностью символов ASCII, несмотря на то, что имена сегмента, определенные Apple, начинаются с двух подчеркиваний и состоят из прописных букв (как в
__TEXT
и__DATA
). Это поле фиксируется в 16 байтах в длине.vmaddr
Указывает стартовый адрес виртуальной памяти этого сегмента.
vmsize
Указывает число байтов виртуальной памяти, занятой этим сегментом. См. также описание
filesize
, ниже.fileoff
Указывает смещение в этом файле данных, которые будут отображены в
vmaddr
.filesize
Указывает число байтов, занятых этим сегментом на диске. Для сегментов, требующих большего количества памяти во время выполнения, чем, они делают во время изготовления,
vmsize
может быть больше, чемfilesize
. Например,__PAGEZERO
сегмент, сгенерированный компоновщиком дляMH_EXECUTABLE
файлы имеют avmsize
из 0x1000, но afilesize
из 0. Поскольку__PAGEZERO
не содержит данных, нет никакой потребности в нем для занятия любого места до времени выполнения. Кроме того, статический компоновщик часто выделяет неинициализированные данные в конце__DATA
сегмент; в этом случае,vmsize
больше, чемfilesize
. Загрузчик гарантирует, что любая память этого вида инициализируется с нулями.maxprot
Указывает максимальные разрешенные меры защиты виртуальной памяти этого сегмента.
initprot
Указывает начальные меры защиты виртуальной памяти этого сегмента.
nsects
Указывает число структур данных раздела после этой команды загрузки.
flags
Определяет ряд флагов, влияющих на загрузку этого сегмента:
SG_HIGHVM
— Содержание файла для этого сегмента для высокой части пространства виртуальной памяти; низкая часть является заполненным нулем (для штабелей в базовых файлах).SG_NORELOC
— Этот сегмент не имеет ничего, что было перемещено в нем и ничто перемещенное к нему. Это может быть безопасно заменено без перемещения.
Доступность
Доступный в OS X v10.6 и позже.
-
Определяет элементы, используемые 32-разрядным разделом. Непосредственно после a
segment_command
структура данных является массивомsection
структуры данных, с точным количеством, определеннымnsects
полеsegment_command
структура. Объявленный в/usr/include/mach-o/loader.h
. См. такжеsection_64
.Объявление
Objective C
struct section { char sectname[16]; char segname[16]; uint32_t addr; uint32_t size; uint32_t offset; uint32_t align; uint32_t reloff; uint32_t nreloc; uint32_t flags; uint32_t reserved1; uint32_t reserved2; };
Поля
sectname
Строка, указывающая имя этого раздела. Значение этого поля может быть любой последовательностью символов ASCII, несмотря на то, что имена раздела, определенные Apple, начинаются с двух подчеркиваний и состоят из строчных букв (как в
__text
и__data
). Это поле фиксируется в 16 байтах в длине.segname
Строка, указывающая имя сегмента, который должен в конечном счете содержать этот раздел. Для компактности, промежуточных объектных файлов — файлы типа
MH_OBJECT
— содержите только один сегмент, в который помещаются все разделы. Статический компоновщик помещает каждый раздел в именованный сегмент при создании конечного продукта (любой файл, который не имеет типаMH_OBJECT
).addr
Целое число, указывающее адрес виртуальной памяти этого раздела.
size
Целое число, указывающее размер в байтах виртуальной памяти, занято этим разделом.
offset
Целое число, указывающее смещение к этому разделу в файле.
align
Целое число, указывающее выравнивание байта раздела. Укажите это как питание два; например, раздел с 8-байтовым выравниванием имел бы выровнять значение 3 (2 к 3-му питанию, равняется 8).
reloff
Целое число, указывающее файловое смещение первой записи перемещения для этого раздела.
nreloc
Целое число, указывающее число записей перемещения, расположилось в
reloff
для этого раздела.flags
Целое число разделилось на две части. Младшие значащие 8 битов содержат тип раздела, в то время как старшие значащие 24 бита содержат ряд флагов, указывающих другие атрибуты раздела. Эти типы и флаги прежде всего используются статическим компоновщиком и аналитическими инструментами файла, такой как
otool
, определить, как изменить или вывести на экран раздел. Это возможные типы:S_REGULAR
— Этот раздел не имеет никакого определенного типа. Стандартные инструменты создают a__TEXT,__text
раздел этого типа.S_ZEROFILL
— Нулевая заливка по требованию разделяет — когда этот раздел сначала считан из или записан в, каждая страница в автоматически заполнена байтами, содержащими нуль.S_CSTRING_LITERALS
— Этот раздел содержит только постоянные струны до. Стандартные инструменты создают a__TEXT,__cstring
раздел этого типа.S_4BYTE_LITERALS
— Этот раздел содержит только постоянные значения, которые 4 байта длиной. Стандартные инструменты создают a__TEXT,__literal4
раздел этого типа.S_8BYTE_LITERALS
— Этот раздел содержит только постоянные значения, которые 8 байтов длиной. Стандартные инструменты создают a__TEXT,__literal8
раздел этого типа.S_LITERAL_POINTERS
— Этот раздел содержит только указатели на постоянные значения.S_NON_LAZY_SYMBOL_POINTERS
— Этот раздел содержит только неленивые указатели на символы. Стандартные инструменты создают раздел__DATA,__nl_symbol_ptrs
раздел этого типа.S_LAZY_SYMBOL_POINTERS
— Этот раздел содержит только ленивые указатели на символы. Стандартные инструменты создают a__DATA,__la_symbol_ptrs
раздел этого типа.S_SYMBOL_STUBS
— — Этот раздел содержит тупики символа. Стандартные инструменты создают__TEXT,__symbol_stub
и__TEXT,__picsymbol_stub
разделы этого типа. См. “Позиционно-независимый Код” в Мужественных Темах Программирования для получения дополнительной информации.S_MOD_INIT_FUNC_POINTERS
— Этот раздел содержит указатели на функции инициализации модуля. Стандартные инструменты создают__DATA,__mod_init_func
разделы этого типа.S_MOD_TERM_FUNC_POINTERS
— Этот раздел содержит указатели на функции завершения модуля. Стандартные инструменты создают__DATA,__mod_term_func
разделы этого типа.S_COALESCED
— Этот раздел содержит символы, объединяющиеся статическим компоновщиком и возможно динамическим компоновщиком. Больше чем один файл может содержать объединенные определения того же символа, не вызывая ошибки «многократный определенный символ».S_GB_ZEROFILL
— Это - заполненный нулями, по требованию разделяют. Это может быть больше, чем 4 ГБ. Этот раздел должен быть помещен в сегмент, содержащий только заполненные нулями разделы. При размещении заполненного нулями раздела в сегмент с незаполненными нулями разделами можно заставить те разделы быть недостижимыми с 31-разрядным смещением. Тот результат происходит от факта, что размер заполненного нулями раздела может быть больше, чем 4 ГБ (в 32-разрядном адресном пространстве). В результате этого статический компоновщик был бы неспособен создать выходной файл. Посмотритеsegment_command
для получения дополнительной информации.
Следующее является возможными атрибутами раздела:
S_ATTR_PURE_INSTRUCTIONS
— Этот раздел содержит только исполнимые машинные команды. Стандартные инструменты устанавливают этот флаг для разделов__TEXT,__text
,__TEXT,__symbol_stub
, и__TEXT,__picsymbol_stub
.S_ATTR_SOME_INSTRUCTIONS
— Этот раздел содержит исполнимые машинные команды.S_ATTR_NO_TOC
— Этот раздел содержит объединенные символы, которые не должны быть помещены в оглавление (SYMDEF
элемент) статической архивной библиотеки.S_ATTR_EXT_RELOC
— Этот раздел содержит ссылки, которые должны быть перемещены. Эти ссылки относятся к данным, существующим в других файлах (неопределенные символы). Для поддержки внешнего перемещения меры защиты максимальной виртуальной памяти сегмента, содержащего этот раздел, должны позволить и чтение и запись.S_ATTR_LOC_RELOC
— Этот раздел содержит ссылки, которые должны быть перемещены. Эти ссылки относятся к данным в этом файле.S_ATTR_STRIP_STATIC_SYMS
— Статические символы в этом разделе могут быть разделены еслиMH_DYLDLINK
флаг изображенияmach_header
структура заголовка установлена.S_ATTR_NO_DEAD_STRIP
— Этот раздел не должен быть мертво разделен. См. «Соединение» для подробных данных.S_ATTR_LIVE_SUPPORT
— Этот раздел не должен быть мертво разделен, если они код ссылки, который жив, но ссылка, необнаруживаемые.
reserved1
Целое число зарезервировано для использования с определенными типами раздела. Для разделов указателя символа и разделов тупиков символа, относящихся к косвенным записям таблицы символов, это - индекс в косвенную таблицу для записей этого раздела. Число записей основывается на размере раздела, разделенном на размер указателя символа или тупика. Иначе, это поле установлено в 0.
reserved2
Для разделов типа
S_SYMBOL_STUBS
, целое число, указывающее размер (в байтах) записей тупика символа, содержится в разделе. Иначе, это поле резервируется для будущего использования и должно быть установлено в 0.Обсуждение
Каждый раздел в Мужественном файле имеет и тип и ряд флагов атрибута. В промежуточных объектных файлах тип и атрибуты определяют, как статический компоновщик копирует разделы в конечный продукт. Аналитические инструменты объектного файла (такой как
otool
) используйте тип и атрибуты, чтобы определить, как считать и вывести на экран разделы. Некоторые типы раздела и атрибуты используются динамическим компоновщиком.Это важные варианты статического подключения типа символа и атрибутов:
Регулярные разделы. В регулярном разделе только одно определение внешнего символа может существовать в промежуточных объектных файлах. Статический компоновщик возвращает ошибку, если она находит какие-либо двойные внешние определения символа.
Объединенные разделы. В конечном продукте статический компоновщик сохраняет только один экземпляр каждого символа, определенного в объединенных разделах. Чтобы поддерживать сложные функции языка (такие как C++ vtables и RTTI), компилятор может создать определение определенного символа в каждом промежуточном объектном файле. Статический компоновщик и динамический компоновщик тогда сократили бы двойные определения единственному определению, используемому программой.
Объединенные разделы со слабыми определениями Слабые определения символа могут появиться только в объединенных разделах. Когда статический компоновщик находит двойные определения для символа, он отбрасывает любое объединенное определение символа, имеющее слабый набор атрибута определения (см.
nlist
). Если нет никаких неслабых определений, первое слабое определение используется вместо этого. Эта функция разработана для поддержки шаблонов C++; это позволяет явным шаблонным инстанцированиям переопределять неявные. Компилятор C++ помещает явные определения в регулярный раздел, и он помещает неявные определения в объединенный раздел, отмеченный как слабые определения. Промежуточные объектные файлы (и таким образом статические архивные библиотеки) созданный со слабыми определениями могут использоваться только со статическим компоновщиком в OS X v10.2 и позже. Конечные продукты (приложения и совместно использованные библиотеки) не должны содержать слабые определения, если они, как ожидают, будут использоваться на более ранних версиях OS X.
Доступность
Доступный в OS X v10.6 и позже.
-
Определяет элементы, используемые 64-разрядным разделом. Непосредственно после a
segment_command_64
структура данных является массивомsection_64
структуры данных, с точным количеством, определеннымnsects
поле segment_command_64 структуры. Объявленный в/usr/include/mach-o/loader.h
.Объявление
Objective C
struct section_64 { char sectname[16]; char segname[16]; uint64_t addr; uint64_t size; uint32_t offset; uint32_t align; uint32_t reloff; uint32_t nreloc; uint32_t flags; uint32_t reserved1; uint32_t reserved2; };
Поля
sectname
Строка, указывающая имя этого раздела. Значение этого поля может быть любой последовательностью символов ASCII, несмотря на то, что имена раздела, определенные Apple, начинаются с двух подчеркиваний и состоят из строчных букв (как в
__text
и__data
). Это поле фиксируется в 16 байтах в длине.segname
Строка, указывающая имя сегмента, который должен в конечном счете содержать этот раздел. Для компактности, промежуточных объектных файлов — файлы типа
MH_OBJECT
— содержите только один сегмент, в который помещаются все разделы. Статический компоновщик помещает каждый раздел в именованный сегмент при создании конечного продукта (любой файл, который не имеет типаMH_OBJECT
).addr
Целое число, указывающее адрес виртуальной памяти этого раздела.
size
Целое число, указывающее размер в байтах виртуальной памяти, занято этим разделом.
offset
Целое число, указывающее смещение к этому разделу в файле.
align
Целое число, указывающее выравнивание байта раздела. Укажите это как питание два; например, раздел с 8-байтовым выравниванием имел бы выровнять значение 3 (2 к 3-му питанию, равняется 8).
reloff
Целое число, указывающее файловое смещение первой записи перемещения для этого раздела.
nreloc
Целое число, указывающее число записей перемещения, расположилось в
reloff
для этого раздела.flags
Целое число разделилось на две части. Младшие значащие 8 битов содержат тип раздела, в то время как старшие значащие 24 бита содержат ряд флагов, указывающих другие атрибуты раздела. Эти типы и флаги прежде всего используются статическим компоновщиком и аналитическими инструментами файла, такой как
otool
, определить, как изменить или вывести на экран раздел. Это возможные типы:S_REGULAR
— Этот раздел не имеет никакого определенного типа. Стандартные инструменты создают a__TEXT,__text
раздел этого типа.S_ZEROFILL
— Нулевая заливка по требованию разделяет — когда этот раздел сначала считан из или записан в, каждая страница в автоматически заполнена байтами, содержащими нуль.S_CSTRING_LITERALS
— Этот раздел содержит только постоянные струны до. Стандартные инструменты создают a__TEXT,__cstring
раздел этого типа.S_4BYTE_LITERALS
— Этот раздел содержит только постоянные значения, которые 4 байта длиной. Стандартные инструменты создают a__TEXT,__literal4
раздел этого типа.S_8BYTE_LITERALS
— Этот раздел содержит только постоянные значения, которые 8 байтов длиной. Стандартные инструменты создают a__TEXT,__literal8
раздел этого типа.S_LITERAL_POINTERS
— Этот раздел содержит только указатели на постоянные значения.S_NON_LAZY_SYMBOL_POINTERS
— Этот раздел содержит только неленивые указатели на символы. Стандартные инструменты создают раздел__DATA,__nl_symbol_ptrs
раздел этого типа.S_LAZY_SYMBOL_POINTERS
— Этот раздел содержит только ленивые указатели на символы. Стандартные инструменты создают a__DATA,__la_symbol_ptrs
раздел этого типа.S_SYMBOL_STUBS
— — Этот раздел содержит тупики символа. Стандартные инструменты создают__TEXT,__symbol_stub
и__TEXT,__picsymbol_stub
разделы этого типа. См. “Позиционно-независимый Код” в Мужественных Темах Программирования для получения дополнительной информации.S_MOD_INIT_FUNC_POINTERS
— Этот раздел содержит указатели на функции инициализации модуля. Стандартные инструменты создают__DATA,__mod_init_func
разделы этого типа.S_MOD_TERM_FUNC_POINTERS
— Этот раздел содержит указатели на функции завершения модуля. Стандартные инструменты создают__DATA,__mod_term_func
разделы этого типа.S_COALESCED
— Этот раздел содержит символы, объединяющиеся статическим компоновщиком и возможно динамическим компоновщиком. Больше чем один файл может содержать объединенные определения того же символа, не вызывая ошибки «многократный определенный символ».S_GB_ZEROFILL
— Это - заполненный нулями, по требованию разделяют. Это может быть больше, чем 4 ГБ. Этот раздел должен быть помещен в сегмент, содержащий только заполненные нулями разделы. При размещении заполненного нулями раздела в сегмент с незаполненными нулями разделами можно заставить те разделы быть недостижимыми с 31-разрядным смещением. Тот результат происходит от факта, что размер заполненного нулями раздела может быть больше, чем 4 ГБ (в 32-разрядном адресном пространстве). В результате этого статический компоновщик был бы неспособен создать выходной файл. Посмотритеsegment_command_64
для получения дополнительной информации.
Следующее является возможными атрибутами раздела:
S_ATTR_PURE_INSTRUCTIONS
— Этот раздел содержит только исполнимые машинные команды. Стандартные инструменты устанавливают этот флаг для разделов__TEXT,__text
,__TEXT,__symbol_stub
, и__TEXT,__picsymbol_stub
.S_ATTR_SOME_INSTRUCTIONS
— Этот раздел содержит исполнимые машинные команды.S_ATTR_NO_TOC
— Этот раздел содержит объединенные символы, которые не должны быть помещены в оглавление (SYMDEF
элемент) статической архивной библиотеки.S_ATTR_EXT_RELOC
— Этот раздел содержит ссылки, которые должны быть перемещены. Эти ссылки относятся к данным, существующим в других файлах (неопределенные символы). Для поддержки внешнего перемещения меры защиты максимальной виртуальной памяти сегмента, содержащего этот раздел, должны позволить и чтение и запись.S_ATTR_LOC_RELOC
— Этот раздел содержит ссылки, которые должны быть перемещены. Эти ссылки относятся к данным в этом файле.S_ATTR_STRIP_STATIC_SYMS
— Статические символы в этом разделе могут быть разделены еслиMH_DYLDLINK
флаг изображенияmach_header
структура заголовка установлена.S_ATTR_NO_DEAD_STRIP
— Этот раздел не должен быть мертво разделен. См. «Соединение» для подробных данных.S_ATTR_LIVE_SUPPORT
— Этот раздел не должен быть мертво разделен, если они код ссылки, который жив, но ссылка, необнаруживаемые.
reserved1
Целое число зарезервировано для использования с определенными типами раздела. Для разделов указателя символа и разделов тупиков символа, относящихся к косвенным записям таблицы символов, это - индекс в косвенную таблицу для записей этого раздела. Число записей основывается на размере раздела, разделенном на размер указателя символа или тупика. Иначе, это поле установлено в 0.
reserved2
Для разделов типа
S_SYMBOL_STUBS
, целое число, указывающее размер (в байтах) записей тупика символа, содержится в разделе. Иначе, это поле резервируется для будущего использования и должно быть установлено в 0.Обсуждение
Каждый раздел в Мужественном файле имеет и тип и ряд флагов атрибута. В промежуточных объектных файлах тип и атрибуты определяют, как статический компоновщик копирует разделы в конечный продукт. Аналитические инструменты объектного файла (такой как
otool
) используйте тип и атрибуты, чтобы определить, как считать и вывести на экран разделы. Некоторые типы раздела и атрибуты используются динамическим компоновщиком.Это важные варианты статического подключения типа символа и атрибутов:
Регулярные разделы. В регулярном разделе только одно определение внешнего символа может существовать в промежуточных объектных файлах. Статический компоновщик возвращает ошибку, если она находит какие-либо двойные внешние определения символа.
Объединенные разделы. В конечном продукте статический компоновщик сохраняет только один экземпляр каждого символа, определенного в объединенных разделах. Чтобы поддерживать сложные функции языка (такие как C++ vtables и RTTI), компилятор может создать определение определенного символа в каждом промежуточном объектном файле. Статический компоновщик и динамический компоновщик тогда сократили бы двойные определения единственному определению, используемому программой.
Объединенные разделы со слабыми определениями Слабые определения символа могут появиться только в объединенных разделах. Когда статический компоновщик находит двойные определения для символа, он отбрасывает любое объединенное определение символа, имеющее слабый набор атрибута определения (см.
nlist
). Если нет никаких неслабых определений, первое слабое определение используется вместо этого. Эта функция разработана для поддержки шаблонов C++; это позволяет явным шаблонным инстанцированиям переопределять неявные. Компилятор C++ помещает явные определения в регулярный раздел, и он помещает неявные определения в объединенный раздел, отмеченный как слабые определения. Промежуточные объектные файлы (и таким образом статические архивные библиотеки) созданный со слабыми определениями могут использоваться только со статическим компоновщиком в OS X v10.2 и позже. Конечные продукты (приложения и совместно использованные библиотеки) не должны содержать слабые определения, если они, как ожидают, будут использоваться на более ранних версиях OS X.
Доступность
Доступный в OS X v10.6 и позже.
-
Определяет атрибуты a
LC_TWOLEVEL_HINTS
команда загрузки. Объявленный в/usr/include/mach-o/loader.h
.Объявление
Objective C
struct twolevel_hints_command { uint32_t cmd; uint32_t cmdsize; uint32_t offset; uint32_t nhints; };
Поля
cmd
Характерный для всех структур команды загрузки. Набор к
LC_TWOLEVEL_HINTS
для этой структуры.cmdsize
Характерный для всех структур команды загрузки. Для этой структуры, набора к
sizeof(twolevel_hints_command)
.offset
Целое число, указывающее байтовое смещение от запуска этого файла к массиву
twolevel_hint
структуры данных, известные как двухуровневая таблица подсказки пространства имен.nhints
Число
twolevel_hint
структуры данных расположились вoffset
.Обсуждение
Статический компоновщик добавляет
LC_TWOLEVEL_HINTS
команда загрузки и двухуровневая таблица подсказки пространства имен к выходному файлу при создании двухуровневого изображения пространства имен.Доступность
Доступный в OS X v10.6 и позже.
-
Указывает запись в двухуровневой таблице подсказки пространства имен. Объявленный в
/usr/include/mach-o/loader.h
.Объявление
Objective C
struct twolevel_hint { uint32_t isub_image:8, itoc:24; };
Поля
isub_image
Подызображение, в котором определяется символ. Это - индекс в список изображений, составляющих изображение зонтика. Если это поле 0, символ находится в самом изображении зонтика. Если изображение не является платформой зонтика или библиотекой, это поле 0.
itoc
Индекс символа в оглавление изображения, указанного
isub_image
поле.Обсуждение
Двухуровневая таблица подсказки пространства имен предоставляет динамическому компоновщику предложенные позиции, чтобы начать искать символы в библиотеках, против которых соединяется текущее изображение.
Каждый неопределенный символ (т.е. каждый символ типа
N_UNDF
илиN_PBUD
) в двухуровневом пространстве имен изображение имеет соответствующую запись в двухуровневой таблице подсказки в том же индексе.Статический компоновщик добавляет
LC_TWOLEVEL_HINTS
команда загрузки и двухуровневая таблица подсказки пространства имен к выходному файлу при создании двухуровневого изображения пространства имен.По умолчанию компоновщик не включает
LC_TWOLEVEL_HINTS
команда или двухуровневая таблица подсказки пространства имен вMH_BUNDLE
файл, потому что присутствие этой команды загрузки заставляет версию динамического компоновщика, поставленного с OS X v10.0 отказывать. Если Вы знаете, что код будет работать только на OS X v10.1 и позже, необходимо явно включить двухуровневые подсказки пространства имен. См. документацию компоновщика для получения дополнительной информации.Доступность
Доступный в OS X v10.6 и позже.
-
Определяет строку переменной длины. Объявленный в
/usr/include/mach-o/loader.h
.Объявление
Objective C
union lc_str { uint32_t offset; #ifndef __LP64__ char *ptr; #endif };
Поля
offset
Длинное целое. Байтовое смещение от запуска команды загрузки, содержащей эту строку к запуску строковых данных.
ptr
Указатель на массив байтов. Во время выполнения этот указатель содержит адрес виртуальной памяти строковых данных.
ptr
поле не используется в Мужественных файлах.Обсуждение
Команды загрузки хранят данные переменной длины, такие как имена библиотеки с помощью
lc_str
структура данных. Если не указано иное данные состоят из струны до.Данные указали, сохранен сразу после команды загрузки, и размер добавляется к размеру команды загрузки. Строка должна быть завершенным нулем; любые дополнительные байты для окружения размера должны быть нулем. Можно также определить размер строки путем вычитания размера структуры данных команды загрузки от
cmdsize
поле структуры данных команды загрузки.Доступность
Доступный в OS X v10.6 и позже.
-
Определяет данные, используемые динамическим компоновщиком для соответствия совместно используемой библиотеки против файлов, соединившихся с ними. Используемый исключительно в
dylib_command
структура данных. Объявленный в/usr/include/mach-o/loader.h
.Объявление
Objective C
struct dylib { union lc_str name; uint_32 timestamp; uint_32 current_version; uint_32 compatibility_version; };
Поля
name
Структура данных типа
lc_str
. Указывает имя совместно используемой библиотеки.timestamp
Дата и время, когда была создана совместно используемая библиотека.
current_version
Текущая версия совместно используемой библиотеки.
compatibility_version
Версия совместимости совместно используемой библиотеки.
Доступность
Доступный в OS X v10.6 и позже.
-
Определяет атрибуты
LC_LOAD_DYLIB
иLC_ID_DYLIB
команды загрузки. Объявленный в/usr/include/mach-o/loader.h
.Объявление
Objective C
struct dylib_command { uint_32 cmd; uint_32 cmdsize; struct dylib dylib; };
Поля
cmd
Характерный для всех структур команды загрузки. Для этой структуры, набора к также
LC_LOAD_DYLIB
,LC_LOAD_WEAK_DYLIB
, илиLC_ID_DYLIB
.cmdsize
Характерный для всех структур команды загрузки. Для этой структуры, набора к
sizeof(dylib_command)
плюс размер данных, на которые указываютname
полеdylib
поле.dylib
Структура данных типа
dylib
. Указывает атрибуты совместно используемой библиотеки.Обсуждение
Для каждой совместно используемой библиотеки, против которой соединяется файл, статический компоновщик создает
LC_LOAD_DYLIB
команда и наборыdylib
поле к значениюdylib
полеLC_ID_DYLD
команда загрузки целевой библиотеки. ВесьLC_LOAD_DYLIB
команды вместе формируют список, упорядочивающийся согласно расположению в файле, самом раннемLC_LOAD_DYLIB
команда сначала. Для двухуровневых файлов пространства имен неопределенные записи символа в таблице символов относятся к совместно использованным библиотекам их родителя индексом в этот список. Индекс вызывают порядковой библиотекой, и он сохранен вn_desc
полеnlist
структура данных.Во время выполнения динамический компоновщик использует имя в
dyld
полеLC_LOAD_DYLIB
команда для определения местоположения совместно используемой библиотеки. Если это находит библиотеку, динамический компоновщик сравнивает информацию о версииLC_LOAD_DYLIB
команда загрузки против версии библиотеки. Для динамического компоновщика для успешного соединения совместно используемой библиотеки версия совместимости совместно используемой библиотеки должна быть меньше чем или равна версии совместимости вLC_LOAD_DYLIB
команда.Динамический компоновщик использует метку времени, чтобы определить, может ли она использовать предобязательную информацию. Текущая версия возвращается функцией
NSVersionOfRunTimeLibrary
чтобы позволить Вам определять версию библиотеки, Ваша программа использует.Доступность
Доступный в OS X v10.6 и позже.
-
Определяет атрибуты
LC_LOAD_DYLINKER
иLC_ID_DYLINKER
команды загрузки. Объявленный в/usr/include/mach-o/loader.h
.Объявление
Objective C
struct dylinker_command { uint32_t cmd; uint32_t cmdsize; union lc_str name; };
Поля
cmd
Характерный для всех структур команды загрузки. Для этой структуры, набора к также
LC_ID_DYLINKER
илиLC_LOAD_DYLINKER
.cmdsize
Характерный для всех структур команды загрузки. Для этой структуры, набора к
sizeof(dylinker_command)
, плюс размер данных, на которые указываютname
поле.name
Структура данных типа
lc_str
. Указывает имя динамического компоновщика.Обсуждение
Каждый динамично соединяющийся исполняемый файл содержит a
LC_LOAD_DYLINKER
команда, указывающая имя динамического компоновщика, которого ядро должно загрузить для выполнения файла. Динамический компоновщик самостоятельно указывает его имя с помощьюLC_ID_DYLINKER
команда загрузки.Доступность
Доступный в OS X v10.6 и позже.
-
Определяет атрибуты
LC_PREBOUND_DYLIB
команда загрузки. Для каждой библиотеки, с которой соединяется предсвязанный исполняемый файл, статический компоновщик добавляет туLC_PREBOUND_DYLIB
команда. Объявленный в/usr/include/mach-o/loader.h
.Объявление
Поля
cmd
Характерный для всех структур команды загрузки. Для этой структуры, набора к
LC_PREBOUND_DYLIB
.cmdsize
Характерный для всех структур команды загрузки. Для этой структуры, набора к
sizeof(prebound_dylib_command)
плюс размер данных, на которые указываютname
иlinked_modules
поля.name
Структура данных типа
lc_str
. Указывает имя предсвязанной совместно используемой библиотеки.nmodules
Целое число. Указывает число модулей, которые содержит предсвязанная совместно используемая библиотека. Размер
linked_modules
строка(nmodules / 8) + (nmodules % 8)
.linked_modules
Структура данных типа
lc_str
. Обычно, эта структура данных определяет смещение струны до; в этом использовании это - переменная длина bitset, содержа один бит для каждого модуля. Каждый бит представляет, соединяется ли соответствующий модуль с модулем в текущем файле, 1 для да, 0 для нет. Бит для первого модуля является младшим битом первого байта.Доступность
Доступный в OS X v10.6 и позже.
-
Определяет атрибуты
LC_THREAD
иLC_UNIXTHREAD
команды загрузки. Данные этой команды являются определенными для каждой архитектуры и появляются вthread_status.h
, расположенный в каталоге архитектуры в/usr/include/mach
. Объявленный в/usr/include/mach-o/loader.h
.Объявление
Objective C
struct thread_command { uint32_t cmd; uint32_t cmdsize; /* uint32_t flavor;*/ /* uint32_t count; */ /* struct cpu_thread_state state;*/ };
Поля
cmd
Характерный для всех структур команды загрузки. Для этой структуры, набора к
LC_THREAD
илиLC_UNIXTHREAD
.cmdsize
Характерный для всех структур команды загрузки. Для этой структуры, набора к
sizeof(thread_command)
плюс размерflavor
иcount
поля плюс размер специфичной для CPU структуры данных состояния потока.flavor
Целое число, указывающее определенную разновидность структуры данных состояния потока. Посмотрите
thread_status.h
файл для Вашей целевой архитектуры.count
Размер данных состояния потока, в числе 32-разрядных целых чисел. Структура данных состояния потока должна быть полностью дополнена к 32-разрядному выравниванию.
Доступность
Доступный в OS X v10.6 и позже.
-
Определяет атрибуты
LC_ROUTINES
команда загрузки, используемая в 32-разрядной архитектуре. Описывает расположение совместно используемой функции инициализации библиотеки, которая является функцией, которую динамический компоновщик вызывает прежде, чем позволить любой из подпрограмм в библиотеке быть вызванной. Объявленный в/usr/include/mach-o/loader.h
. См. такжеroutines_command_64
.Объявление
Objective C
struct routines_command { uint32_t cmd; uint32_t cmdsize; uint32_t init_address; uint32_t init_module; uint32_t reserved1; uint32_t reserved2; uint32_t reserved3; uint32_t reserved4; uint32_t reserved5; uint32_t reserved6; };
Поля
cmd
Характерный для всех структур команды загрузки. Для этой структуры, набора к
LC_ROUTINES
.cmdsize
Характерный для всех структур команды загрузки. Для этой структуры, набора к
sizeof(routines_command)
.init_address
Целое число, указывающее адрес виртуальной памяти функции инициализации.
init_module
Целое число, указывающее индекс в таблицу модуля модуля, содержащего функцию инициализации.
reserved1
Зарезервированный для будущего использования. Установите это поле в
0
.reserved2
Зарезервированный для будущего использования. Установите это поле в
0
.reserved3
Зарезервированный для будущего использования. Установите это поле в
0
.reserved4
Зарезервированный для будущего использования. Установите это поле в
0
.reserved5
Зарезервированный для будущего использования. Установите это поле в
0
.reserved6
Зарезервированный для будущего использования. Установите это поле в
0
.Обсуждение
Статический компоновщик добавляет
LC_ROUTINES
команда, когда Вы указываете совместно используемую функцию инициализации библиотеки использование-init
опция (см.ld
страница справочника для получения дополнительной информации).Доступность
Доступный в OS X v10.6 и позже.
-
Определяет атрибуты
LC_ROUTINES_64
команда загрузки, используемая в 64-разрядной архитектуре. Описывает расположение совместно используемой функции инициализации библиотеки, которая является функцией, которую динамический компоновщик вызывает прежде, чем позволить любой из подпрограмм в библиотеке быть вызванной. Объявленный в/usr/include/mach-o/loader.h
.Объявление
Objective C
struct routines_command_64 { uint32_t cmd; uint32_t cmdsize; uint64_t init_address; uint64_t init_module; uint64_t reserved1; uint64_t reserved2; uint64_t reserved3; uint64_t reserved4; uint64_t reserved5; uint64_t reserved6; };
Поля
cmd
Характерный для всех структур команды загрузки. Для этой структуры, набора к
LC_ROUTINES_64
.cmdsize
Характерный для всех структур команды загрузки. Для этой структуры, набора к
sizeof(routines_command_64)
.init_address
Целое число, указывающее адрес виртуальной памяти функции инициализации.
init_module
Целое число, указывающее индекс в таблицу модуля модуля, содержащего функцию инициализации.
reserved1
Зарезервированный для будущего использования. Установите это поле в
0
.reserved2
Зарезервированный для будущего использования. Установите это поле в
0
.reserved3
Зарезервированный для будущего использования. Установите это поле в
0
.reserved4
Зарезервированный для будущего использования. Установите это поле в
0
.reserved5
Зарезервированный для будущего использования. Установите это поле в
0
.reserved6
Зарезервированный для будущего использования. Установите это поле в
0
.Обсуждение
Статический компоновщик добавляет
LC_ROUTINES_64
команда, когда Вы указываете совместно используемую функцию инициализации библиотеки использование-init
опция (см.ld
страница справочника для получения дополнительной информации).Доступность
Доступный в OS X v10.6 и позже.
-
Определяет атрибуты
LC_SUB_FRAMEWORK
команда загрузки. Идентифицирует платформу зонтика, которой этот файл является подплатформой. Объявленный в/usr/include/mach-o/loader.h
.Объявление
Objective C
struct sub_framework_command { uint32_t cmd; uint32_t cmdsize; union lc_str umbrella; };
Поля
cmd
Характерный для всех структур команды загрузки. Для этой структуры, набора к
LC_SUB_FRAMEWORK
.cmdsize
Характерный для всех структур команды загрузки. Для этой структуры, набора к
sizeof(sub_framework_command)
плюс размер данных, на которые указываютumbrella
поле.umbrella
Структура данных типа
lc_str
. Указывает имя платформы зонтика, которой этот файл является элементом.Доступность
Доступный в OS X v10.6 и позже.
-
Определяет атрибуты
LC_SUB_UMBRELLA
команда загрузки. Идентифицирует именованную платформу как подзонтик этой платформы. В отличие от подплатформы, любой клиент может соединиться с подзонтиком. Объявленный в/usr/include/mach-o/loader.h
.Объявление
Objective C
struct sub_umbrella_command { uint32_t cmd; uint32_t cmdsize; union lc_str sub_umbrella; };
Поля
cmd
Характерный для всех структур команды загрузки. Для этой структуры, набора к
LC_SUB_UMBRELLA
.cmdsize
Характерный для всех структур команды загрузки. Для этой структуры, набора к
sizeof(sub_umbrella_command)
плюс размер данных, на которые указываютsub_umbrella
поле.sub_umbrella
Структура данных типа
lc_str
. Указывает имя платформы зонтика, которой этот файл является элементом.Доступность
Доступный в OS X v10.6 и позже.
-
Определяет атрибуты
LC_SUB_LIBRARY
команда загрузки. Идентифицирует подбиблиотеку этой платформы и отмечает эту платформу как платформу зонтика. В отличие от подплатформы, любой клиент может соединиться с подбиблиотекой. Объявленный в/usr/include/mach-o/loader.h
.Объявление
Objective C
struct sub_library_command { uint32_t cmd; uint32_t cmdsize; union lc_str sub_library; };
Поля
cmd
Характерный для всех структур команды загрузки. Для этой структуры, набора к
LC_SUB_LIBRARY
.cmdsize
Характерный для всех структур команды загрузки. Для этой структуры, набора к
sizeof(sub_library_command)
плюс размер данных, на которые указываютsub_library
поле.sub_library
Структура данных типа
lc_str
. Указывает имя подбиблиотеки, которой этот файл является элементом.Доступность
Доступный в OS X v10.6 и позже.
-
Определяет атрибуты
LC_SUB_CLIENT
команда загрузки. Указывает имя файла, которому позволяют соединиться с этой подплатформой. Этот файл иначе потребовался бы, чтобы соединяться с платформой зонтика, которой этот файл является компонентом. Объявленный в/usr/include/mach-o/loader.h
.Объявление
Objective C
struct sub_client_command { uint32_t cmd; uint32_t cmdsize; union lc_str client; };
Поля
cmd
Характерный для всех структур команды загрузки. Для этой структуры, набора к
LC_SUB_CLIENT
.cmdsize
Характерный для всех структур команды загрузки. Для этой структуры, набора к
sizeof(sub_client_command)
плюс размер данных, на которые указываютclient
поле.client
Структура данных типа
lc_str
. Указывает имя клиента, разрешенного соединяться с этой библиотекой.Доступность
Доступный в OS X v10.6 и позже.
Две команды загрузки, LC_SYMTAB
и LC_DYSYMTAB
, опишите размер и расположение таблиц символов, вместе с дополнительными метаданными. Другие структуры данных, перечисленные в этом разделе, представляют сами таблицы символов.
-
Определяет атрибуты
LC_SYMTAB
команда загрузки. Описывает размер и расположение структур данных таблицы символов. Объявленный в/usr/include/mach-o/loader.h
.Объявление
Objective C
struct symtab_command { uint_32 cmd; uint_32 cmdsize; uint_32 symoff; uint_32 nsyms; uint_32 stroff; uint_32 strsize; };
Поля
cmd
Характерный для всех структур команды загрузки. Для этой структуры, набора к
LC_SYMTAB
.cmdsize
Характерный для всех структур команды загрузки. Для этой структуры, набора к
sizeof(symtab_command)
.symoff
Целое число, содержащее байтовое смещение от запуска файла к расположению записей таблицы символов. Таблица символов является массивом
nlist
структуры данных.nsyms
Целое число, указывающее число записей в таблице символов.
stroff
Целое число, содержащее байтовое смещение от запуска изображения к расположению таблицы строк.
strsize
Целое число, указывающее размер (в байтах) таблицы строк.
Обсуждение
LC_SYMTAB
должен существовать и в статически соединенных и в динамично соединенных типах файлов.Доступность
Доступный в OS X v10.6 и позже.
-
Описывает запись в таблице символов для 32-разрядной архитектуры. Объявленный в
/usr/include/mach-o/nlist.h
. См. такжеnlist_64
.Объявление
Objective C
struct nlist { union { #ifndef __LP64__ char *n_name; #endif int32_t n_strx; } n_un; uint8_t n_type; uint8_t n_sect; int16_t n_desc; uint32_t n_value; };
Поля
n_un
Объединение, содержащее индекс в таблицу строк,
n_strx
. Указать пустую строку (""
), установите это значение в 0.n_name
поле не используется в Мужественных файлах.n_type
Значение байта, состоящее из данных, получило доступ к использованию четырех битовых масок:
N_STAB
(0xe0) — Если какой-либо из этих 3 битов установлен, символ является символьной таблицей отладки (stab
) запись. В этом случае, всеn_type
поле интерпретируется как astab
значение. Посмотрите/usr/include/mach-o/stab.h
для допустимых значений удара.N_PEXT
(0x10) — Если этот бит идет, этот символ отмечен как ограничивавший глобальную область видимости. Когда файл питается статическому компоновщику, он очищаетсяN_EXT
бит для каждого символа сN_PEXT
набор битов. (ld
опция-keep_private_externs
выключает это поведение.) С OS X GCC можно использовать__private_extern__
функционируйте атрибут для установки этого бита.N_TYPE
(0x0e) — Эти биты определяют тип символа.N_EXT
(0x01) — Если этот бит идет, этот символ является внешним символом, символ, или определяющийся вне этого файла или это определяется в этом файле, но может быть сослано другими файлами.
Значения для
N_TYPE
поле включает:N_UNDF
(0x0) — Символ не определен. Неопределенные символы являются символами, на которые ссылаются в этом модуле, но определенными в различном модуле.n_sect
поле установлено вNO_SECT
.N_ABS
(0x2) — Символ является абсолютным. Компоновщик не изменяет значение абсолютного символа.n_sect
поле установлено вNO_SECT
.N_SECT
(0xe) — Символ определяется в поданном числе разделаn_sect
.N_PBUD
(0xc) — Символ не определен, и изображение использует предсвязанное значение для символа.n_sect
поле установлено вNO_SECT
.N_INDR
(0xa) — Символ определяется для совпадения с другим символом.n_value
поле является индексом в таблицу строк, указывающую имя другого символа. Когда тот символ соединяется, и это и другой символ имеют тот же определенный тип и значение.
n_sect
Целое число, указывающее число раздела, которым этот символ может быть найден в, или
NO_SECT
если символ не должен быть найден ни в каком разделе этого изображения. Разделы непрерывно пронумерованы через сегменты, запускающиеся от 1, согласно порядку, они появляются вLC_SEGMENT
команды загрузки.n_desc
16-разрядное значение, предоставляющее дополнительную информацию о природе этого символа для символов неудара. К ссылочным флагам можно получить доступ с помощью
REFERENCE_TYPE
маска (0xF) и определяется следующим образом:REFERENCE_FLAG_UNDEFINED_NON_LAZY
(0x0) — Этот символ является ссылкой на внешнее неленивое (данные) символ.REFERENCE_FLAG_UNDEFINED_LAZY
(0x1) — Этот символ является ссылкой на внешний ленивый символ — т.е. на вызов функции.REFERENCE_FLAG_DEFINED
(0x2) — Этот символ определяется в этом модуле.REFERENCE_FLAG_PRIVATE_DEFINED
(0x3) — Этот символ определяется в этом модуле и видим только к модулям в этой совместно используемой библиотеке.REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY
(0x4) — Этот символ определяется в другом модуле в этом файле, является неленивым (данные) символ и видим только к модулям в этой совместно используемой библиотеке.REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY
(0x5) — Этот символ определяется в другом модуле в этом файле, является ленивым (функциональным) символом и видим только к модулям в этой совместно используемой библиотеке.
Кроме того, следующие биты могли бы также быть установлены:
REFERENCED_DYNAMICALLY
(0x10) — Должен быть установлен для любого определенного символа, на который ссылается динамический загрузчик APIs (такой какdlsym
и
NSLookupSymbolInImage
) и не обычные неопределенные ссылки символа.
strip
инструмент использует этот бит, чтобы избежать удалять символы, которые должны существовать: Если символ имеет этот набор битов,strip
не разделяет его.N_DESC_DISCARDED
(0x20) — Иногда используемый динамическим компоновщиком во время выполнения в полностью соединенном изображении. Не устанавливайте этот бит в полностью соединенном изображении.N_NO_DEAD_STRIP
(0x20) — Когда установлено в перемещаемом объектном файле (тип файлаMH_OBJECT
) на определенном символе, указывает статическому компоновщику к никогда мертвой полосе символ. (Обратите внимание на то, что тот же бит (0x20) используется в двух неперекрывающихся целях.)N_WEAK_REF
(0x40) — Указывает, что этот неопределенный символ является слабой ссылкой. Если динамический компоновщик не может найти определение для этого символа, это устанавливает адрес этого символа к 0. Статический компоновщик устанавливает этот символ, данный надлежащие слабо соединяющиеся флаги.N_WEAK_DEF
(0x80) — Указывает, что этот символ является слабым определением. Если статический компоновщик или динамический компоновщик находят другое (неслабое) определение для этого символа, слабое определение проигнорировано. Только символы в объединенномsection
может быть отмечен как слабое определение.
Если этот файл является двухуровневым изображением пространства имен (т.е. если
MH_TWOLEVEL
флагmach_header
структура установлена), высокие 8 битовn_desc
укажите число библиотеки, в которой определяется этот неопределенный символ. Используйте макросGET_LIBRARY_ORDINAL
получить это значение и макросSET_LIBRARY_ORDINAL
установить его. Нуль указывает текущее изображение. 1 - 253 указывают номер библиотеки согласно порядкуLC_LOAD_DYLIB
команды в файле. Значение 254 используется для неопределенных символов, которые должны динамично искаться (поддерживаемый только в OS X v10.3 и позже). Для плагинов, загружающих символы из исполняемой программы, они соединяются против, 255, указывает исполнимое изображение. Для плоских изображений пространства имен высокие 8 битов должны быть 0.n_value
Целое число, содержащее значение символа. Формат этого значения отличается для каждого типа записи таблицы символов (как указано
n_type
поле). ДляN_SECT
тип символа,n_value
адрес символа. См. описаниеn_type
поле для получения информации о других возможных значениях.Обсуждение
Обычные символы должны иметь тип
N_UNDF
и должен иметьN_EXT
набор битов.n_value
поскольку обычный символ является размером (в байтах) данных символа. В C обычный символ является переменной, объявляющейся, но не инициализирующейся в этом файле. Обычные символы могут появиться только вMH_OBJECT
Мужественные файлы.Доступность
Доступный в OS X v10.8 и позже.
-
Описывает запись в таблице символов для 64-разрядной архитектуры. Объявленный в
/usr/include/mach-o/nlist.h
.Объявление
Objective C
struct nlist_64 { union { uint32_t n_strx; } n_un; uint8_t n_type; uint8_t n_sect; uint16_t n_desc; uint64_t n_value; };
Поля
n_un
Объединение, содержащее индекс в таблицу строк,
n_strx
. Указать пустую строку (""
), установите это значение в 0.n_type
Значение байта, состоящее из данных, получило доступ к использованию четырех битовых масок:
N_STAB
(0xe0) — Если какой-либо из этих 3 битов установлен, символ является символьной таблицей отладки (stab
) запись. В этом случае, всеn_type
поле интерпретируется как astab
значение. Посмотрите/usr/include/mach-o/stab.h
для допустимых значений удара.N_PEXT
(0x10) — Если этот бит идет, этот символ отмечен как ограничивавший глобальную область видимости. Когда файл питается статическому компоновщику, он очищаетсяN_EXT
бит для каждого символа сN_PEXT
набор битов. (ld
опция-keep_private_externs
выключает это поведение.) С OS X GCC можно использовать__private_extern__
функционируйте атрибут для установки этого бита.N_TYPE
(0x0e) — Эти биты определяют тип символа.N_EXT
(0x01) — Если этот бит идет, этот символ является внешним символом, символ, или определяющийся вне этого файла или это определяется в этом файле, но может быть сослано другими файлами.
Значения для
N_TYPE
поле включает:N_UNDF
(0x0) — Символ не определен. Неопределенные символы являются символами, на которые ссылаются в этом модуле, но определенными в различном модуле. Установитеn_sect
поле кNO_SECT
.N_ABS
(0x2) — Символ является абсолютным. Компоновщик не обновляет значение абсолютного символа. Установитеn_sect
поле кNO_SECT
.N_SECT
(0xe) — Символ определяется в поданном числе разделаn_sect
.N_PBUD
(0xc) — Символ не определен, и изображение использует предсвязанное значение для символа. Установитеn_sect
поле кNO_SECT
.N_INDR
(0xa) — Символ определяется для совпадения с другим символом.n_value
поле является индексом в таблицу строк, указывающую имя другого символа. Когда тот символ соединяется, и это и другой символ указывают на тот же определенный тип и значение.
n_sect
Целое число, указывающее число раздела, которым этот символ может быть найден в, или
NO_SECT
если символ не должен быть найден ни в каком разделе этого изображения. Разделы непрерывно пронумерованы через сегменты, запускающиеся от 1, согласно порядку, они появляются вLC_SEGMENT
команды загрузки.n_desc
16-разрядное значение, предоставляющее дополнительную информацию о природе этого символа. К ссылочным флагам можно получить доступ с помощью
REFERENCE_TYPE
маска (0xF) и определяется следующим образом:REFERENCE_FLAG_UNDEFINED_NON_LAZY
(0x0) — Этот символ является ссылкой на внешнее неленивое (данные) символ.REFERENCE_FLAG_UNDEFINED_LAZY
(0x1) — Этот символ является ссылкой на внешний ленивый символ — т.е. на вызов функции.REFERENCE_FLAG_DEFINED
(0x2) — Этот символ определяется в этом модуле.REFERENCE_FLAG_PRIVATE_DEFINED
(0x3) — Этот символ определяется в этом модуле и видим только к модулям в этой совместно используемой библиотеке.REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY
(0x4) — Этот символ определяется в другом модуле в этом файле, является неленивым (данные) символ и видим только к модулям в этой совместно используемой библиотеке.REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY
(0x5) — Этот символ определяется в другом модуле в этом файле, является ленивым (функциональным) символом и видим только к модулям в этой совместно используемой библиотеке.
Кроме того, следующие биты могли бы также быть установлены:
REFERENCED_DYNAMICALLY
(0x10) — Должен быть установлен для любого определенного символа, на который ссылается динамический загрузчик APIs (такой какdlsym
и
NSLookupSymbolInImage
) и не обычные неопределенные ссылки символа.
strip
инструмент использует этот бит, чтобы избежать удалять символы, которые должны существовать: Если символ имеет этот набор битов,strip
не разделяет его.N_DESC_DISCARDED
(0x20) — Используемый динамическим компоновщиком во время выполнения. Не устанавливайте этот бит.N_WEAK_REF
(0x40) — Указывает, что этот символ является слабой ссылкой. Если динамический компоновщик не может найти определение для этого символа, это устанавливает адрес этого символа к 0. Статический компоновщик устанавливает этот символ, данный надлежащие слабо соединяющиеся флаги.N_WEAK_DEF
(0x80) — Указывает, что этот символ является слабым определением. Если статический компоновщик или динамический компоновщик находят другое (неслабое) определение для этого символа, слабое определение проигнорировано. Только символы в объединенномsection
может быть отмечен как слабое определение.
Если этот файл является двухуровневым изображением пространства имен (т.е. если
MH_TWOLEVEL
флагmach_header
структура установлена), высокие 8 битовn_desc
укажите число библиотеки, в которой определяется этот символ. Используйте макросGET_LIBRARY_ORDINAL
получить это значение и макросSET_LIBRARY_ORDINAL
установить его. Нуль указывает текущее изображение. 1 - 254 указывают номер библиотеки согласно порядкуLC_LOAD_DYLIB
команды в файле. Для плагинов, загружающих символы из исполняемой программы, они соединяются против, 255, указывает исполнимое изображение. Для плоских изображений пространства имен высокие 8 битов должны быть 0.n_value
Целое число, содержащее значение символа. Формат этого значения отличается для каждого типа записи таблицы символов (как указано
n_type
поле). ДляN_SECT
тип символа,n_value
адрес символа. См. описаниеn_type
поле для получения информации о других возможных значениях.Обсуждение
Посмотрите обсуждение в
nlist
.Доступность
Доступный в OS X v10.8 и позже.
-
Структура данных для
LC_DYSYMTAB
команда загрузки. Это описывает размеры и расположения частей таблицы символов, используемой для динамического подключения. Объявленный в/usr/include/mach-o/loader.h
.Объявление
Objective C
struct dysymtab_command { uint32_t cmd; uint32_t cmdsize; uint32_t ilocalsym; uint32_t nlocalsym; uint32_t iextdefsym; uint32_t nextdefsym; uint32_t iundefsym; uint32_t nundefsym; uint32_t tocoff; uint32_t ntoc; uint32_t modtaboff; uint32_t nmodtab; uint32_t extrefsymoff; uint32_t nextrefsyms; uint32_t indirectsymoff; uint32_t nindirectsyms; uint32_t extreloff; uint32_t nextrel; uint32_t locreloff; uint32_t nlocrel; };
Поля
cmd
Характерный для всех структур команды загрузки. Для этой структуры, набора к
LC_DYSYMTAB
.cmdsize
Характерный для всех структур команды загрузки. Для этой структуры, набора к
sizeof(dysymtab_command)
.ilocalsym
Целое число, указывающее индекс первого символа в группе локальных символов.
nlocalsym
Целое число, указывающее общее количество символов в группе локальных символов.
iextdefsym
Целое число, указывающее индекс первого символа в группе определенных внешних символов.
nextdefsym
Целое число, указывающее общее количество символов в группе определенных внешних символов.
iundefsym
Целое число, указывающее индекс первого символа в группе неопределенных внешних символов.
nundefsym
Целое число, указывающее общее количество символов в группе неопределенных внешних символов.
tocoff
Целое число, указывающее байтовое смещение от запуска файла к данным оглавления.
ntoc
Целое число, указывающее число записей в оглавлении.
modtaboff
Целое число, указывающее байтовое смещение от запуска файла к табличным данным модуля.
nmodtab
Целое число, указывающее число записей в таблице модуля.
extrefsymoff
Целое число, указывающее байтовое смещение от запуска файла к табличным данным внешней ссылки.
nextrefsyms
Целое число, указывающее число записей в таблице внешней ссылки.
indirectsymoff
Целое число, указывающее байтовое смещение от запуска файла к косвенным данным таблицы символов.
nindirectsyms
Целое число, указывающее число записей в косвенной таблице символов.
extreloff
Целое число, указывающее байтовое смещение от запуска файла к внешним табличным данным перемещения.
nextrel
Целое число, указывающее число записей во внешней таблице перемещения.
locreloff
Целое число, указывающее байтовое смещение от запуска файла к локальным табличным данным перемещения.
nlocrel
Целое число, указывающее число записей в локальной таблице перемещения.
Обсуждение
LC_DYSYMTAB
команда загрузки содержит ряд индексов в таблицу символов и ряд файловых смещений, определяющих расположение нескольких других таблиц. Поля для таблиц, не используемых в файле, должны быть установлены в 0. Эти таблицы описаны в “Позиционно-независимом Коде” в Мужественных Темах Программирования.Доступность
Доступный в OS X v10.6 и позже.
-
Описывает запись в оглавлении динамической совместно используемой библиотеки. Объявленный в
/usr/include/mach-o/loader.h
.Объявление
Objective C
struct dylib_table_of_contents { uint32_t symbol_index; uint32_t module_index; };
Поля
symbol_index
Индекс в таблицу символов, указывающую определенный внешний символ, к которому относится эта запись.
module_index
Индекс в таблицу модуля, указывающую модуль, в котором определяется этот определенный внешний символ.
Доступность
Доступный в OS X v10.6 и позже.
-
Описывает запись таблицы модуля для динамической совместно используемой библиотеки для 32-разрядной архитектуры. Объявленный в
/usr/include/mach-o/loader.h
. См. такжеdylib_module_64
.Объявление
Objective C
struct dylib_module { uint32_t module_name; uint32_t iextdefsym; uint32_t nextdefsym; uint32_t irefsym; uint32_t nrefsym; uint32_t ilocalsym; uint32_t nlocalsym; uint32_t iextrel; uint32_t nextrel; uint32_t iinit_iterm; uint32_t ninit_nterm; uint32_t objc_module_info_addr; uint32_t objc_module_info_size; };
Поля
module_name
Индекс к записи в таблице строк, указывающей имя модуля.
iextdefsym
Индекс в таблицу символов первого определенного внешнего символа, предоставленного этим модулем.
nextdefsym
Число определенных внешних символов, предоставленных этим модулем.
irefsym
Индекс в таблицу внешней ссылки первой записи, предоставленной этим модулем.
nrefsym
Число записей внешней ссылки, предоставленных этим модулем.
ilocalsym
Индекс в таблицу символов первого локального символа, предоставленного этим модулем.
nlocalsym
Число локальных символов, предоставленных этим модулем.
iextrel
Индекс во внешнюю таблицу перемещения первой записи, предоставленной этим модулем.
nextrel
Число записей во внешней таблице перемещения, которые предоставлены этим модулем.
iinit_iterm
Содержит обоих индекс в раздел инициализации модуля (низкие 16 битов) и индекс в раздел завершения модуля (высокие 16 битов) к указателям для этого модуля.
ninit_nterm
Содержит обоих число указателей в инициализации модуля (низкие 16 битов) и число указателей в разделе завершения модуля (высокие 16 битов) для этого модуля.
objc_module_info_addr
Статически соединенный адрес запуска данных для этого модуля в
__module_info
раздел в__OBJC
сегмент.objc_module_info_size
Число байтов данных для этого модуля, использующихся в
__module_info
раздел в__OBJC
сегмент.Доступность
Доступный в OS X v10.6 и позже.
-
Описывает запись таблицы модуля для динамической совместно используемой библиотеки для 64-разрядной архитектуры. Объявленный в
/usr/include/mach-o/loader.h
.Объявление
Objective C
struct dylib_module_64 { uint32_t module_name; uint32_t iextdefsym; uint32_t nextdefsym; uint32_t irefsym; uint32_t nrefsym; uint32_t ilocalsym; uint32_t nlocalsym; uint32_t iextrel; uint32_t nextrel; uint32_t iinit_iterm; uint32_t ninit_nterm; uint32_t objc_module_info_size; uint64_t objc_module_info_addr; };
Поля
module_name
Индекс к записи в таблице строк, указывающей имя модуля.
iextdefsym
Индекс в таблицу символов первого определенного внешнего символа, предоставленного этим модулем.
nextdefsym
Число определенных внешних символов, предоставленных этим модулем.
irefsym
Индекс в таблицу внешней ссылки первой записи, предоставленной этим модулем.
nrefsym
Число записей внешней ссылки, предоставленных этим модулем.
ilocalsym
Индекс в таблицу символов первого локального символа, предоставленного этим модулем.
nlocalsym
Число локальных символов, предоставленных этим модулем.
iextrel
Индекс во внешнюю таблицу перемещения первой записи, предоставленной этим модулем.
nextrel
Число записей во внешней таблице перемещения, которые предоставлены этим модулем.
iinit_iterm
Содержит обоих индекс в раздел инициализации модуля (низкие 16 битов) и индекс в раздел завершения модуля (высокие 16 битов) к указателям для этого модуля.
ninit_nterm
Содержит обоих число указателей в инициализации модуля (низкие 16 битов) и число указателей в разделе завершения модуля (высокие 16 битов) для этого модуля.
objc_module_info_addr
Статически соединенный адрес запуска данных для этого модуля в
__module_info
раздел в__OBJC
сегмент.objc_module_info_size
Число байтов данных для этого модуля, использующихся в
__module_info
раздел в__OBJC
сегмент.Доступность
Доступный в OS X v10.6 и позже.
-
Определяет атрибуты записи таблицы внешней ссылки для записей внешней ссылки, предоставленных модулем в совместно используемой библиотеке. Объявленный в
/usr/include/mach-o/loader.h
.Объявление
Objective C
struct dylib_reference { uint32_t isym:24, flags:8; };
Поля
isym
Индекс в таблицу символов для ссылаемого символа.
flags
Константа для типа сделанной ссылки. Используйте то же
REFERENCE_FLAG
константы, как описано вnlist
описание структуры.Доступность
Доступный в OS X v10.6 и позже.
Перемещение является процессом движущихся символов к различному адресу. Когда статический компоновщик перемещает символ (функция или элемент данных) к различному адресу, это должно изменить все ссылки на тот символ для использования нового адреса. Записи перемещения в Мужественном файле содержат смещения в файле к, удовлетворяет ту потребность, которая будет перемещена, когда перемещено содержание файла. Адреса, сохраненные в инструкциях CPU, могут быть абсолютными или относительными. Каждая запись перемещения указывает точный формат адреса. При создании промежуточного объектного файла компилятор генерирует одну или более записей перемещения для каждой инструкции, содержащей адрес. Поскольку перемещение к символам в фиксированных адресах, и к относительным адресам для позиции независимые ссылки, не происходит во время выполнения, статический компоновщик обычно удаляет некоторых или все записи перемещения при создании конечного продукта.
-
Описывает элемент в файле, использующем адрес, который должен быть обновлен, когда изменяется адрес. Объявленный в
/usr/include/mach-o/reloc.h
.Объявление
Objective C
struct relocation_info { int32_t r_address; uint32_t r_symbolnum:24, r_pcrel:1, r_length:2, r_extern:1, r_type:4; };
Поля
r_address
В
MH_OBJECT
файлы, это - смещение от запуска раздела к элементу, содержащему перемещение требования адреса. Если высокий бит этого поля установлен (который можно проверить использованиеR_SCATTERED
битовая маска),relocation_info
структура фактически ascattered_relocation_info
структура.В изображениях, используемых динамическим компоновщиком, это - смещение от адреса виртуальной памяти данных первого
segment_command
это появляется в файле (не обязательно тот с самым низким адресом). Для изображений сMH_SPLIT_SEGS
набор флага, это - смещение от адреса виртуальной памяти данных первого чтения-записиsegment_command
.r_symbolnum
Указывает любого индекс в таблицу символов (когда
r_extern
поле установлено в 1) или число раздела (когдаr_extern
поле установлено в 0). Как ранее упомянуто, разделы упорядочиваются от 1 до 255 в порядке, в котором они появляются вLC_SEGMENT
команды загрузки. Это поле установлено вR_ABS
для записей перемещения для абсолютных символов, которым не нужно никакое перемещение.r_pcrel
Указывает, является ли элемент, содержащий адрес, который будет перемещен, частью инструкции CPU, использующей относительную адресацию PC.
Для адресов, содержавшихся в относительных PC инструкциях, CPU добавляет адрес инструкции к адресу, содержавшемуся в инструкции.
r_length
Указывает длину элемента, содержащего адрес, который будет перемещен. В следующей таблице перечислены значения r_length и соответствующую длину адреса.
Значение
Длина адреса
0
1 байт
1
2 байта
2
4 байта
3
8 байтов. См. описание для
PPC_RELOC_BR14
r_type
вscattered_relocation_info
.r_extern
Указывает ли
r_symbolnum
поле является индексом в таблицу символов (1) или раздел номер (0).r_type
Для x86 среды,
r_type
поле может содержать любое из этих значений:GENERIC_RELOC_VANILLA
— Универсальная запись перемещения и для адресов, содержавшихся в данных и для адресов, содержится в инструкциях CPU.GENERIC_RELOC_PAIR
— Вторая запись перемещения пары.GENERIC_RELOC_SECTDIFF
— Запись перемещения для элемента, содержащего различие двух адресов раздела. Это обычно используется для позиционно-независимой генерации кода.GENERIC_RELOC_SECTDIFF
содержит адрес, из которого можно вычесть; это должно сопровождаться aGENERIC_RELOC_PAIR
содержа адрес для вычитания.GENERIC_RELOC_LOCAL_SECTDIFF
— ПодобныйGENERIC_RELOC_SECTDIFF
за исключением того, что эта запись относится в частности к адресу в этом элементе. Если адрес является адресом глобально видимого объединенного символа, эта запись перемещения не изменяется, если переопределяется символ. Это используется для соединения информации о раскручивании штабеля с объектным кодом, который описывает эта запись перемещения.GENERIC_RELOC_PB_LA_PTR
— Запись перемещения для предсвязанного ленивого указателя. Это всегда - рассеянная запись перемещения.r_value
поле содержит непредсвязанное значение ленивого указателя.
Для x86-64 среды,
r_type
поле может содержать любое из этих значений:X86_64_RELOC_BRANCH
— Инструкция CALL/JMP с 32-разрядным смещением.X86_64_RELOC_GOT_LOAD
— Загрузка MOVQ записи GOT.X86_64_RELOC_GOT
— Другие ссылки GOT.X86_64_RELOC_SIGNED
— 32-разрядное смещение со знаком.X86_64_RELOC_UNSIGNED
— Абсолютный адрес.X86_64_RELOC_SUBTRACTOR
— Должен сопровождаться aX86_64_RELOC_UNSIGNED
перемещение.
Для сред PowerPC,
r_type
поле обычноPPC_RELOC_VANILLA
для адресов, содержавшихся в данных. Записи перемещения для адресов, содержавшихся в инструкциях CPU, описаны другимr_type
значения:PPC_RELOC_PAIR
— Вторая запись перемещения пары. APPC_RELOC_PAIR
запись должна следовать за каждым из других типов записи перемещения, за исключениемPPC_RELOC_VANILLA
,PPC_RELOC_BR14
,PPC_RELOC_BR24
, иPPC_RELOC_PB_LA_PTR
.PPC_RELOC_BR14
— Инструкция содержит 14-разрядное смещение ответвления. Еслиr_length
3
, ответвление было статически предсказано путем установки, или очистка Y укусила в зависимости от знака смещения или кода операции.PPC_RELOC_BR24
— Инструкция содержит 24-разрядное смещение ответвления.PPC_RELOC_HI16
— Инструкция содержит высокие 16 битов переместимого выражения. Следующая запись перемещения должна быть aPPC_RELOC_PAIR
указание низких 16 битов выражения в низких 16 битахr_value
поле.PPC_RELOC_LO16
— Инструкция содержит низкие 16 битов адреса. Следующая запись перемещения должна быть aPPC_RELOC_PAIR
указание высоких 16 битов выражения в нижнем уровне (не верхний уровень) 16 битовr_value
поле.PPC_RELOC_HA16
— То же какPPC_RELOC_HI16
кроме низких 16 битов и высоких 16 битов добавляются вместе с низкими 16 битами, расширенными до знака сначала. Это означает, корректируется ли бит, 15 из низких 16 битов установлены, высокие 16 битов, сохраненных в инструкции.PPC_RELOC_LO14
— То же какPPC_RELOC_LO16
за исключением того, что низкие 2 бита не сохранены в инструкции CPU и всегда 0.PPC_RELOC_LO14
используется в 64-разрядных инструкциях загрузки и хранения.PPC_RELOC_SECTDIFF
— Запись перемещения для элемента, содержащего различие двух адресов раздела. Это обычно используется для позиционно-независимой генерации кода.PPC_RELOC_SECTDIFF
содержит адрес, из которого можно вычесть; это должно сопровождаться aPPC_RELOC_PAIR
содержание раздела адресуется для вычитания.PPC_RELOC_LOCAL_SECTDIFF
— Подобный PPC_RELOC_SECTDIFF за исключением того, что эта запись относится в частности к адресу в этом элементе. Если адрес является адресом глобально видимого объединенного символа, эта запись перемещения не изменяется, если переопределяется символ. Это используется для соединения информации о раскручивании штабеля с объектным кодом, который описывает эта запись перемещенияPPC_RELOC_PB_LA_PTR
— Запись перемещения для предсвязанного ленивого указателя. Это всегда - рассеянная запись перемещения.r_value
поле содержит непредсвязанное значение ленивого указателя.PPC_RELOC_HI16_SECTDIFF
— Форма различия в разделеPPC_RELOC_HI16
.PPC_RELOC_LO16_SECTDIFF
— Форма различия в разделеPPC_RELOC_LO16
.PPC_RELOC_HA16_SECTDIFF
— Форма различия в разделеPPC_RELOC_HA16
.PPC_RELOC_JBSR
— Запись перемещения для ассемблерного синтетического кода операцииjbsr
, который является 24-разрядной инструкцией ответвления-и-ссылки с помощью острова ответвления. Смещение ответвления собрано к островному адресу ответвления, и запись перемещения указывает фактический целевой символ. Если компоновщик в состоянии заставить ответвление достигнуть фактического целевого символа, оно делает. Иначе, ответвление перемещено к острову ответвления.PPC_RELOC_LO14_SECTDIFF
— Форма различия в разделеPPC_RELOC_LO14
.
Доступность
Доступный в OS X v10.8 и позже.
-
Описывает элемент в файле — использовании ненулевой константы в ее переместимом выражении или двух адресов в ее переместимом выражении — который должен быть обновлен, если изменяются адреса, которые он использует. Эта информация необходима для восстановления адресов, составляющих значение переместимого выражения для изменения адресов друг независимо от друга. Объявленный в
/usr/include/mach-o/reloc.h
.Объявление
Objective C
struct scattered_relocation_info { #ifdef __BIG_ENDIAN__ uint32_t r_scattered:1, r_pcrel:1, r_length:2, r_type:4, r_address:24; int32_t r_value; #endif /* __BIG_ENDIAN__ */ #ifdef __LITTLE_ENDIAN__ uint32_t r_address:24, r_type:4, r_length:2, r_pcrel:1, r_scattered:1; int32_t r_value; # endif /* __LITTLE_ENDIAN__ */ };
Поля
r_scattered
Если этот бит 0, эта структура фактически a
relocation_info
структура.r_address
В
MH_OBJECT
файлы, это - смещение от запуска раздела к элементу, содержащему перемещение требования адреса. Если высокий бит этого поля ясен (который можно проверить использованиеR_SCATTERED
битовая маска), эта структура фактически arelocation_info
структура.В изображениях, используемых динамическим компоновщиком, это - смещение от адреса виртуальной памяти данных первого
segment_command
это появляется в файле (не обязательно тот с самым низким адресом). Для изображений сMH_SPLIT_SEGS
набор флага, это - смещение от адреса виртуальной памяти данных первого чтения-записиsegment_command
.Так как это поле только 24 бита длиной, смещение в этом поле никогда не может быть больше, чем 0x00FFFFFF, таким образом ограничив размер перемещаемого содержания этого изображения к 16 мегабайтам.
r_pcrel
Указывает, является ли элемент, содержащий адрес, который будет перемещен, частью инструкции CPU, использующей относительную адресацию PC.
Для адресов, содержавшихся в относительных PC инструкциях, CPU добавляет адрес инструкции к адресу, содержавшемуся в инструкции.
r_length
Указывает длину элемента, содержащего адрес, который будет перемещен. Значение 0 указывает единственный байт; значение 1 указывает 2-байтовый адрес, и значение 2 указывает 4-байтовый адрес.
r_type
Указывает тип перемещения, которое будет выполняться. Возможные значения для этого поля совместно используются этой структурой и
relocation_info
структура данных; см. описаниеr_type
поле вrelocation_info
структура данных для большего количества подробных данных.r_value
Адрес переместимого выражения для элемента в файле, который должен быть обновлен, если изменяется адрес. Для переместимых выражений с различием двух адресов раздела адрес, из которого можно вычесть (в математическом элементе, уменьшаемом) содержится в первой записи перемещения, и адрес для вычитания (вычитаемое) содержится во второй записи перемещения.
Обсуждение
Мужественные структуры данных перемещения поддерживают два типа переместимых выражений в машинном коде и данных:
Адрес символа + постоянный. Самая типичная форма перемещения ссылается на адрес символа без добавленной константы. В этом случае значение константного выражения 0.
Адрес раздела y – адрес раздела x + постоянный. Форма различия в разделе перемещения. Эта форма перемещения поддерживает позиционно-независимый код.
Доступность
Доступный в OS X v10.8 и позже.
В этом разделе описываются формат файла, используемый для статических архивных библиотек. OS X использует формат, полученный из исходного BSD статический архивный формат библиотеки с несколькими незначительными дополнениями. Посмотрите обсуждение для ranlib
структура данных для получения дополнительной информации.
-
Определяет атрибуты статической архивной записи таблицы символов библиотеки. Объявленный в
/usr/include/mach-o/ranlib.h
.Объявление
Objective C
struct ranlib { union { uint32_t ran_strx; #ifndef __LP64__ char *ran_name; # endif } ran_un; uint32_t ran_off; };
Поля
ran_strx
Индекс (основанный на нуле) из строки в таблице строк, следующей за массивом
ranlib
структуры данных.ran_name
Байтовое смещение, от запуска файла, в котором может быть найдено имя символа. Это поле не используется в Мужественных файлах.
ran_off
Байтовое смещение, от запуска файла, в котором может быть найдена строка заголовка для элемента, содержащего этот символ.
Обсуждение
Статическая архивная библиотека начинает со строки идентификатора файла
!<arch>
, сопровождаемый символом новой строки (ASCII оценивает 0x0A). Строка идентификатора файла сопровождается серией задействованных файлов. Каждый элемент состоит из строки заголовка фиксированной длины, сопровождаемой данными файла. Строка заголовка 60 байтов длиной и разделена на пять полей фиксированной длины, как показано в этой строке заголовка в качестве примера:grapple.c 999514211 501 20 100644 167 `
Последние 2 байта строки заголовка являются серьезным диакритическим знаком (
`
) символ (ASCII оценивает 0x60), и символ новой строки. Все поля заголовка определяются в ASCII и дополняются пробелами к полному из поля. Все поля определяются в десятичной записи, за исключением поля режима файла, определяющегося в восьмеричном. Это описания для каждого поля:Поле имени (16 байтов) содержит имя файла. Если имя является или дольше, чем 16 байтов или содержит пробел, подлинное имя должно быть написано непосредственно после того, как строка заголовка и поле имени должны содержать строку
#1/
сопровождаемый длиной. Сохранить записи архива выровнялось к 8-байтовым границам, длине имени, следующего#1/
округлен к 8 байтам и имя, следующее, заголовок дополняется нулевыми байтами.Измененное поле даты (12 байтов) взято от
st_time
поле, возвращенноеstat
системный вызов.Поле идентификатора пользователя (6 байтов) взято от
st_uid
поле, возвращенноеstat
системный вызов.Поле ID группы (6 байтов) взято от
st_gid
поле, возвращенноеstat
системный вызов.Поле режима файла (8 байтов) взято от
st_mode
поле, возвращенноеstat
системный вызов. Это поле записано в восьмеричной нотации.Поле размера файла (8 байтов) взято от
st_size
поле, возвращенноеstat
системный вызов.
Первый элемент в статической архивной библиотеке всегда является таблицей символов, описывающей содержание остальной части задействованных файлов. Этот элемент всегда вызывают также
__.SYMDEF
или__.SYMDEF SORTED
(отметьте эти два начальных символа подчеркивания и период). Используемое имя зависит от порядка сортировки таблицы символов. Более старый вариант —__.SYMDEF
— содержит записи в том же порядке, что они появляются в объектных файлах. Более новый вариант —__.SYMDEF SORTED
— содержит записи в алфавитном порядке, который позволяет статическому компоновщику загружать символы быстрее.__.SYMDEF
и.__SORTED SYMDEF
архивные элементы содержат массивranlib
структуры данных, которым предшествует длина в байтах (длинное целое, 4 байтах) числа элементов в массиве. Массив сопровождается таблицей строк завершенных нулем строк, которым предшествует длина в байтах всей таблицы строк (снова, 4-байтовое длинное целое).Таблица строк является массивом струн до, каждый завершенный нулевым байтом.
ranlib
объявления могут быть найдены в/usr/include/mach-o/ranlib.h
.
Стандартные инструменты разработки принимают как параметры два вида двоичных файлов:
Объектные файлы предназначены для одной архитектуры. Они включают Мужественные файлы, статические библиотеки и динамические библиотеки.
Двоичные файлы предназначены больше чем для одной архитектуры. Эти двоичные файлы содержат скомпилированный код и данные для одного из этих системных типов:
Основанный на PowerPC (32-разрядный и 64-разрядный) компьютеры Macintosh. Двоичные файлы, содержащие код и для 32-разрядных и для 64-разрядных основанных на PowerPC компьютеров Macintosh, известны как двоичные файлы PPC/PPC64.
Основанный на Intel и основанный на PowerPC (32-разрядный, 64-разрядный, или оба) компьютеры Macintosh. Двоичные файлы, содержащие код и для основанных на Intel и для основанных на PowerPC компьютеров Macintosh, известны как универсальные двоичные файлы.
Каждый объектный файл хранится как непрерывный набор байтов при смещении с начала двоичного файла. Они используют простой архивный формат, чтобы хранить эти два объектных файла со специальным заголовком в начале файла, чтобы позволить различным инструментам во время выполнения быстро считать код подходящим для текущей архитектуры.
Двоичный файл, содержащий код больше чем для одной архитектуры всегда, начинается с a fat_header
структура данных, сопровождаемая два fat_arch
структуры данных и фактические данные для архитектуры содержатся в файле. Все данные в этих структурах данных хранятся в обратном порядке байтов.
-
Определяет расположение двоичного файла, содержащего код больше чем для одной архитектуры. Объявленный в заголовке
/usr/include/mach-o/fat.h
.Объявление
Objective C
struct fat_header { uint32_t magic; uint32_t nfat_arch; };
Поля
magic
Целое число, содержащее значение
0xCAFEBABE
в формате обратного порядка байтов. На узле с обратным порядком байтов CPU это может быть проверено с помощью константыFAT_MAGIC
; на узле с прямым порядком байтов CPU это может быть проверено с помощью константыFAT_CIGAM
.nfat_arch
Целое число, указывающее число
fat_arch
следующие структуры данных. Это - число архитектуры, содержавшейся в этом двоичном файле.Обсуждение
fat_header
структура данных помещается в начале двоичного файла, содержащего код для многократной архитектуры. Непосредственно послеfat_header
структура данных является рядомfat_arch
структуры данных, один для каждой архитектуры включены в двоичный файл.Независимо от содержания эта структура данных описывает, все ее поля сохранены в обратном порядке байтов.
Доступность
Доступный в OS X v10.8 и позже.
-
Описывает расположение в двоичном файле объектного файла, предназначенного для единой архитектуры. Объявленный в
/usr/include/mach-o/fat.h
.Объявление
Objective C
struct fat_arch { cpu_type_t cputype; cpu_subtype_t cpusubtype; uint32_t offset; uint32_t size; uint32_t align; };
Поля
cputype
Перечислимая величина типа
cpu_type_t
. Указывает семью CPU.cpusubtype
Перечислимая величина типа
cpu_subtype_t
. Указывает определенный элемент семьи CPU, на которой эта запись может использоваться или постоянное указание всех элементов.offset
Смещение к началу данных для этого CPU.
size
Размер данных для этого CPU.
align
Питание 2 выравнивания для смещения объектного файла для архитектуры, указанной в
cputype
в двоичном файле. Это требуется, чтобы гарантировать, что, если этот двоичный файл изменяется, содержание, он сохраняет, правильно выровненные для разбивки на страницы виртуальной памяти и другого использования.Обсуждение
Массив
fat_arch
структуры данных появляются непосредственно послеfat_header
структура данных двоичного файла, содержащего объектные файлы для многократной архитектуры.Независимо от содержания эта структура данных описывает, все ее поля сохранены в обратном порядке байтов.
Доступность
Доступный в OS X v10.8 и позже.