Как установить команду загрузчика DYLD, которая явно не поддерживается ld?

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

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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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