Я хочу динамически загрузить файл 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")
Спасибо за любую помощь!