我想从Mac OS上的/Applications/Firefox.app/Contents/MacOS/目录动态加载libnss3.dylib文件,并使用其中的某些功能。但是我有一个错误-“无效的句柄传递给dlsym()”。当我将DYLD_LIBRARY_PATH设置为该库所在的目录时,一切正常。但是有时我需要以sudo模式执行该程序,并sudo删除所有以DYLD_ *开头的变量,因此我需要找到其他一些选项才能成功执行我的程序。
在没有环境变量的情况下,运行二进制文件时我在终端中有以下输出: “传递给dlsym()的无效句柄”
使用DYLD_LIBRARY_PATH环境变量,输出为: “将证书安装到certstore:确定”
libnss3.dylib的 otool -L
选项:
/Applications/Firefox.app/Contents/MacOS/libnss3.dylib: @ executable_path / libnss3.dylib(兼容版本1.0.0,当前版本1.0.0) /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa(兼容版本1.0.0,当前版本22.0.0) /usr/lib/libobjc.A.dylib(兼容版本1.0.0,当前版本228.0.0) /System/Library/Frameworks/AudioToolbox.framework/Versions/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)
/System/Library/Frameworks/CoreServices.framework/Versions/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
}
terminal的输出是err := dlerror("dlopen")
行之后的fmt.Println函数的输出
谢谢您的帮助!