Как я могу установить команду загрузчика DYLD, которая явно не поддерживается ld? - PullRequest
10 голосов
/ 19 ноября 2011

В Mac OS X двоичные исполняемые файлы в формате DYLD содержат «команды загрузчика», которые инструктируют систему загрузки библиотеки, как обращаться с содержимым файла. В частности, команда загрузчика указывает системе, где следует искать зависимые библиотеки и т. Д.

Вы можете просмотреть полный список команд загрузчика для любого двоичного файла в вашей системе, запустив "otool -l /path/to/your/app".

Вообще говоря, эти команды загрузчика устанавливаются инструментом "ld" во время фазы компиляции проекта.

Мой вопрос: что мне нужно сделать, чтобы добавить команды загрузчика для опубликованных типов, которые не поддерживаются (по-видимому) ld?

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

Я не вижу никаких аргументов в пользу ld, которые бы способствовали этому. Мне нужно что-то вроде «-sectcreate», но для конкретного добавления к содержимому команд загрузчика.

Я знаю, что это возможно, потому что по крайней мере одно стандартное приложение в Mac OS X использует его: Safari. Но я не знаю, достигают ли они этого каким-либо пост-линковым массажем двоичного файла, используют ли они собственную версию ld, которая знает, как собирать и объединять пользовательскую команду загрузчика, или используют ли они универсальная функция команды ld, которую я не смог выяснить.

Ответы [ 2 ]

14 голосов
/ 19 ноября 2011

Похоже, вы можете использовать -dyld_env, например так: "-dyld_env DYLD_FRAMEWORK_PATH = /". Это не задокументировано на странице руководства, но его можно найти в файле Options.cpp ld64 и упомянуть в файле Changelog. Если вы пытаетесь сделать это из Xcode, вам, вероятно, придется сделать это так: "-Xlinker -dyld_env -Xlinker DYLD_FRAMEWORK_PATH = /".

Стоит отметить: если вы посмотрите dyld.cpp в dyld, вы увидите, что он допускает только те переменные окружения, которые начинаются с DYLD_ и заканчиваются на _PATH.

8 голосов
/ 19 ноября 2011

Если ваш исполняемый файл структурирован как часть стандартного пакета приложений OS X (т. Е. .App, который может быть запущен пользователем), обычный способ указать переменные среды приложения - через его plist-файл, используя LSEnvironmentключ.См. здесь для получения дополнительной информации.

...