Spec-Zone .ru
спецификации, руководства, описания, API

Библиотека разработчика Mac

Разработчик

OS X ABI мужественная ссылка формата файла

Опции
Развертывание Target:

На этой странице

OS X ABI мужественная ссылка формата файла

Этот документ описывает структуру Мачо (объект Маха) формат файла, который является стандартом, используемым для хранения программ и библиотек по диску в двоичном интерфейсе приложения (ABI) Mac. Чтобы понять, как инструменты Xcode работают с Мужественными файлами, и выполнять низкоуровневые задачи отладки, необходимо понять эту информацию.

Мужественный формат файла обеспечивает оба промежуточных звена (во время процесса сборки) и финал (после соединения конечного продукта) хранение машинного кода и данных. Это было разработано как гибкая замена для BSD a.out формат, чтобы использоваться компилятором и статическим компоновщиком и содержать статически соединенный исполняемый код во время выполнения. Опции динамического подключения были добавлены как цели развитого OS X, приведя к единственному формату файла и для статически соединенного и для динамично соединенного кода.

Базовая структура

Мужественный файл содержит три главных области (как показано на рисунке 1):

  • В начале каждого Мужественного файла структура заголовка, идентифицирующая файл как Мужественный файл. Заголовок также содержит другую основную информацию о типе файла, указывает целевую архитектуру и содержит флаги, указывающие опции, влияющие на интерпретацию остальной части файла.

  • Непосредственно после заголовка ряд команд загрузки переменного размера, указывающих характеристики расположения и связи файла. Среди другой информации команды загрузки могут указать:

    • Начальное расположение файла в виртуальной памяти

    • Расположение таблицы символов (используемый для динамического подключения)

    • Начальный режим выполнения основного потока программы

    • Имена совместно используемых библиотек, содержащих определения для импортированных символов основной исполнимой программы

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

  • На пользовательском уровне полностью соединил Мужественные файлы, последний сегмент является сегментом редактирования ссылки. Этот сегмент содержит таблицы информации о редактировании ссылки, такие как таблица символов, таблица строк, и т.д, используемый динамическим загрузчиком для соединения исполняемого файла или Мужественного пакета к его зависимым библиотекам.

Базовая структура формата файла рисунка 1Mach-O image: ../art/mach_o_segments.eps

Различные таблицы в Мужественном файле относятся к разделам числом. Нумерация раздела начинается в 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 тип данных.

Табличные 1The разделы a __TEXT сегмент

Сегмент и имя раздела

Содержание

__TEXT,__text

Исполнимый машинный код. Компилятор обычно помещает только исполняемый код в этот раздел, никакие таблицы или данные любого вида.

__TEXT,__cstring

Постоянные струны до. Струна до является последовательностью ненулевых байтов, заканчивающейся нулевым байтом ('\0'). Статический компоновщик объединяет постоянные значения струны до, удаляя копии, при создании конечного продукта.

__TEXT,__picsymbol_stub

Позиционно-независимые косвенные тупики символа. См. “Позиционно-независимый Код” в Мужественных Темах Программирования для получения дополнительной информации.

__TEXT,__symbol_stub

Косвенные тупики символа. См. “Позиционно-независимый Код” в Мужественных Темах Программирования для получения дополнительной информации.

__TEXT,__const

Инициализированные постоянные переменные. Компилятор помещает все неперемещаемые объявленные данные const в этом разделе. (Компилятор обычно помещает неинициализированные постоянные переменные в заполненный нулями раздел.)

__TEXT,__literal4

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

__TEXT,__literal8

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

Табличные 2The разделы a __DATA сегмент

Сегмент и имя раздела

Содержание

__DATA,__data

Инициализированные непостоянные переменные, такие как перезаписываемые струны до и массивы данных.

__DATA,__la_symbol_ptr

Ленивые указатели символа, которые являются косвенными ссылками на функции, импортированные из различного файла. См. “Позиционно-независимый Код” в Мужественных Темах Программирования для получения дополнительной информации.

__DATA,__nl_symbol_ptr

Неленивые указатели символа, которые являются косвенными ссылками на элементы данных, импортированные из различного файла. См. “Позиционно-независимый Код” в Мужественных Темах Программирования для получения дополнительной информации.

__DATA,__dyld

Раздел Placeholder используется динамическим компоновщиком.

__DATA,__const

Инициализированные перемещаемые постоянные переменные.

__DATA,__mod_init_func

Функции инициализации модуля. Компилятор C++ размещает статических конструкторов сюда.

__DATA,__mod_term_func

Функции завершения модуля.

__DATA,__bss

Данные для неинициализированных статических переменных (например, static int i;).

__DATA,__common

Неинициализированные импортированные определения символа (например, int i;) расположенный в глобальной области видимости (за пределами объявления функции).

Табличные 3The разделы a __IMPORT сегмент

Сегмент и имя раздела

Содержание

__IMPORT,__jump_table

Тупики для вызовов к функциям в динамической библиотеке.

__IMPORT,__pointers

Неленивые указатели символа, которые являются прямыми ссылками к функциям, импортированным из различного файла.

Типы данных

Структура данных заголовка

  • Указывает общие атрибуты файла. Появляется в начале объектных файлов, предназначенных к 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 компьютеров Macintosh

    • CPU_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

    uuid_command

    Указывает 128-разрядный UUID для изображения или его соответствующего dSYM файла.

    LC_SEGMENT

    segment_command

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

    LC_SEGMENT_64

    segment_command_64

    Определяет 64-разрядный сегмент этого файла, который будет отображен в адресное пространство процесса, загружающего этот файл. Это также включает все разделы, содержавшие сегментом.

    LC_SYMTAB

    symtab_command

    Указывает таблицу символов для этого файла. Эта информация используется и статическими и динамическими компоновщиками при соединении файла, и также отладчиками для отображения символов на файлы кода первоисточника, от которых были сгенерированы символы.

    LC_DYSYMTAB

    dysymtab_command

    Указывает дополнительную информацию о таблице символов, используемую динамическим компоновщиком.

    LC_THREADLC_UNIXTHREAD

    thread_command

    Для исполняемого файла, LC_UNIXTHREAD команда определяет начальное состояние потока основного потока процесса. LC_THREAD подобно LC_UNIXTHREAD но не заставляет ядро выделять штабель.

    LC_LOAD_DYLIB

    dylib_command

    Определяет имя динамической совместно используемой библиотеки, против которой соединяется этот файл.

    LC_ID_DYLIB

    dylib_command

    Указывает имя установки динамической совместно используемой библиотеки.

    LC_PREBOUND_DYLIB

    prebound_dylib_command

    Для совместно используемой библиотеки, против которой эта исполнимая программа соединяется предварительно связанная, указывает использующиеся модули в совместно используемой библиотеке.

    LC_LOAD_DYLINKER

    dylinker_command

    Указывает динамического компоновщика, которого ядро выполняет для загрузки этого файла.

    LC_ID_DYLINKER

    dylinker_command

    Идентифицирует этот файл как динамического компоновщика.

    LC_ROUTINES

    routines_command

    Содержит адрес совместно используемой подпрограммы инициализации библиотеки (указанный компоновщиком -init опция).

    LC_ROUTINES_64

    routines_command_64

    Содержит адрес совместно используемой библиотеки 64-разрядная подпрограмма инициализации (указанный компоновщиком -init опция).

    LC_TWOLEVEL_HINTS

    twolevel_hints_command

    Содержит двухуровневую таблицу подсказки поиска пространства имен.

    LC_SUB_FRAMEWORK

    sub_framework_command

    Идентифицирует этот файл как реализацию подплатформы платформы зонтика. Имя платформы зонтика сохранено в строковом параметре.

    LC_SUB_UMBRELLA

    sub_umbrella_command

    Указывает файл, который является подзонтиком этой платформы зонтика.

    LC_SUB_LIBRARY

    sub_library_command

    Определяет атрибуты LC_SUB_LIBRARY команда загрузки. Идентифицирует подбиблиотеку этой платформы и отмечает эту платформу как платформу зонтика.

    LC_SUB_CLIENT

    sub_client_command

    Подплатформа может явно позволить другой платформе или пакету соединяться против него включением 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 файлы имеют a vmsize из 0x1000, но a filesize из 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 файлы имеют a vmsize из 0x1000, но a filesize из 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.

    Объявление

    Objective C

    struct prebound_dylib_command { uint32_t cmd; uint32_t cmdsize; union lc_str name; uint32_t nmodules; union lc_str linked_modules; };

    Поля

    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 поле интерпретируется как a stab значение. Посмотрите /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 поле интерпретируется как a stab значение. Посмотрите /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 структура фактически a scattered_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 содержит адрес, из которого можно вычесть; это должно сопровождаться a GENERIC_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— Должен сопровождаться a X86_64_RELOC_UNSIGNED перемещение.

    Для сред PowerPC, r_type поле обычно PPC_RELOC_VANILLA для адресов, содержавшихся в данных. Записи перемещения для адресов, содержавшихся в инструкциях CPU, описаны другим r_type значения:

    • PPC_RELOC_PAIR— Вторая запись перемещения пары. A PPC_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 битов переместимого выражения. Следующая запись перемещения должна быть a PPC_RELOC_PAIR указание низких 16 битов выражения в низких 16 битах r_value поле.

    • PPC_RELOC_LO16— Инструкция содержит низкие 16 битов адреса. Следующая запись перемещения должна быть a PPC_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 содержит адрес, из которого можно вычесть; это должно сопровождаться a PPC_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 битовая маска), эта структура фактически a relocation_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.

Универсальные Двоичные файлы и 32-bit/64-bit Двоичные файлы PowerPC

Стандартные инструменты разработки принимают как параметры два вида двоичных файлов:

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

  • Двоичные файлы предназначены больше чем для одной архитектуры. Эти двоичные файлы содержат скомпилированный код и данные для одного из этих системных типов:

    • Основанный на 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 и позже.