在Mac OS上不使用'dlopen'函数导出DYLD_LIBRARY_PATH变量的情况下打开动态库文件(.dylib)

时间:2019-06-05 11:26:48

标签: macos dynamic loading

我想从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函数的输出 谢谢您的帮助!

0 个答案:

没有答案