Проблемы с использованием setenv и последующим вызовом dlopen - PullRequest
5 голосов
/ 16 июля 2011

Я использую setenv для установки DYLD_LIBRARY_PATH, поэтому, когда я делаю dlopen (), у него будут правильные пути для поиска моего .dylib, но когда я делаю dlopen (), он не ищет пути, которые я добавилдо DYLD_LIBRARY_PATH.

Из того, что я могу собрать, мои изменения в DYLD_LIBRARY_PATH не вступят в силу, пока не произойдет повторное выполнение моего процесса.Это правильно?

Также, если это правильно, есть ли способ установить DYLD_LIBRARY_PATH и заставить мои изменения работать без сброса моего процесса.

О да, я пишу этот код наMAC OSX.

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 18 июля 2011

Я не знаю, как работает Mac OS, но в Linux загрузчик считывает значение getenv("LD_LIBRARY_PATH") один раз и сохраняет его задолго до запуска первой инструкции вашего исполняемого файла. Последующее изменение LD_LIBRARY_PATH программой затрагивает только любые дочерние элементы execve() s, но не сам процесс. Я думаю, что это похоже на Mac OS.

Обычный способ обойти это - либо повторно execve обработать (это делает Java), либо использовать оболочку-оболочку, которая устанавливает среду, а затем исполняет настоящий двоичный файл (это делает Firefox).

Возможно, существует специальный способ обновления пути поиска в библиотеке для Mac OS, хотя Google, похоже, не находит совпадений. Я почти уверен, что не такой механизм в Linux.

2 голосов
/ 26 июля 2011

Ответ на мой вопрос: нет, вы не можете использовать setenv без повторного выполнения процесса в LD_LIBRARY_PATH для переменной среды, которая влияет на dlopen.

Я обнаружил, что вы должны использовать @exectuable_path, @loader_path или @rpath в качестве пути имени для установки на моем .dylb, так что вы можете выполнить поиск относительного пути к своим .dylibs из dlopen.*

...