переопределение @executable_path в DLL, загруженной с помощью dlopen ()

Операционная система - MacOS X, а именно 10.5 (Leopard) на PowerPC G4, но у меня такая же проблема на x86, работающем под управлением 10.6.

Я пишу приложение, которое динамически загружает DLL. DLL (назовем ее foo.dylib ) является частью другого приложения, расположенного в другом месте на жестком диске; мое приложение находит foo. dylib программно (точное размещение может измениться, возможно, пользователь указывает путь к DLL через графический интерфейс из самого запущенного приложения). Например, предположим, что мое приложение находится в каталоге /Application/MyApp.app/Contents/MacOS , а foo.dylib находится в / Application / OtherApp. приложение / Содержание / MacOS . Загрузка DLL использует dlopen () .

Теперь выясняется, что самому foo.dylib нужна куча других DLL, которые находятся в том же каталоге, но о которых я заранее ничего не знаю. Каждая такая дополнительная DLL регистрируется в foo.dylib с таким путем, как @ исполняемый_путь / bar.dylib . Семантика @executable_path состоит в том, что он должен быть заменен каталогом, в котором был найден исполняемый файл текущего процесса. Это отлично работает для OtherApp, а не для меня: когда я открываю foo.dylib , он пытается загрузить bar.dylib и ищет его в / Application / MyApp .app / Contents / MacOS / bar.dylib , который не является правильным каталогом.

Временное решение - установить для переменной среды DYLD_FALLBACK_LIBRARY_PATH значение /Application/OtherApp.app/ Contents / MacOS , но это необходимо сделать до запуска моего приложения (эта переменная среды считывается динамическим компоновщиком только один раз; изменение ее значения программно с помощью setenv () или putenv () не действует). Это несовместимо с динамическим обнаружением местоположения файла foo.dylib .

Есть ли программный способ переопределить эффект @executable_path ?

7
задан Thomas Pornin 22 March 2011 в 23:12
поделиться