Не удается открыть файл динамической библиотеки (.dylib) без экспорта переменной DYLD_LIBRARY_PATH с помощью функции «dlopen» в Mac OS - PullRequest
0 голосов
/ 05 июня 2019

Я хочу динамически загрузить файл libnss3.dylib из каталога /Applications/Firefox.app/Contents/MacOS/ в Mac OS и использовать некоторые функции из него.Но у меня есть ошибка - «неверный дескриптор передан в dlsym ()».Когда я устанавливаю DYLD_LIBRARY_PATH в каталог, где находится эта библиотека - все работает нормально.Но иногда мне нужно выполнить эту программу в режиме sudo и удалить sudo все переменные, которые начинаются с DYLD_ *, поэтому мне нужно найти какой-то другой вариант для успешного выполнения моей программы.

Без переменной окружения у меня есть такой вывод втерминал при запуске двоичного файла: «недопустимый дескриптор передан в dlsym ()»

С переменной среды DYLD_LIBRARY_PATH вывод: «Установить сертификат в хранилище сертификатов: OK»

otool -L опция для libnss3.dylib:

/ Applications / Firefox.app / Contents / MacOS / libnss3.dylib: @ executetable_path / libnss3.dylib (совместимость версия 1.0.0, текущая версия 1.0.0) / Система / Библиотека / Frameworks / Какао.framework / Версии / A / Какао (совместимость версии 1.0.0, текущая версия 22.0.0) /usr/lib/libobjc.A.dylib (совместимость версии 1.0.0, текущая версия 228.0.0) / System / Library / Frameworks /AudioToolbox.framework / Версии / A / AudioToolbox (версия совместимости 1.0.0, текущая версия 492.0.0) /System/Library/Frameworks/ExceptionHandling.framework/Versions / A / ExceptionHandling (совместимость версия 1.0.0, текущая версия 11.0.0)

@executable_path/libmozglue.dylib (compatibility version 1.0.0, current version 1.0.0)

/ Система / Библиотека / Frameworks / CoreServices.framework / Версии / A / CoreServices (совместимость версия 1.0.0, текущая версия 728.9.0) /usr/lib/libSystem.B.dylib (совместимость версия 1.0.0, текущая версия 1226.10.1)

Так что это зависит от файла libmozglue.dylib, но libnss3.dylib "должен знать, где это", или нет?Вот некоторый код, это самое начало файла:

var (
    nsspath = C.CString("/Applications/Firefox.app/Contents/MacOS/libnss3.dylib")
libNSS = C.dlopen(nsspath, C.RTLD_LAZY)
)
if libNSS == nil {
    err := dlerror("dlopen")
    fmt.Println(err)
}
...
func dlerror(ctx string) error {
    errptr := C.dlerror()
    if errptr != nil {
        return errors.New(C.GoString(errptr))
    }
    return nil
}

Вывод терминала - это вывод функции fmt.Println после строки err := dlerror("dlopen") Спасибо за любую помощь!

...