![](/img/trans.png)
[英]sanitizer-leak is NOT detected when golang using cgo to call c library
[英]Golang call functions from shared c library using cgo
我对更底层的编程语言还很陌生,如果答案很明显,我很抱歉。
对于一个项目,我需要导入一个共享库(sdk.so)并调用它的函数。 使用nm -D /lib/sdk.so --defined-only
我可以查看导出的函数,所以我知道它们存在。
现在我想调用某些函数,所以我加载了库:
package main
// #cgo LDFLAGS: -ldl
// #include <stdlib.h>
// #include <dlfcn.h>
import "C"
import (
"errors"
"fmt"
"log"
"unsafe"
)
libName := "sdk"
libName := C.CString(name)
defer C.free(unsafe.Pointer(libName))
handle := C.dlopen(libName, C.RTLD_LAZY)
if handle == nil {
return nil, ErrSoNotFound
}
sym := C.CString("some_function")
defer C.free(unsafe.Pointer(sym))
someFunction := C.dlsym(handle, sym)
if mdpSdkAlloc == nil {
log.Fatal(ErrSoFunctionNotFound)
}
fmt.Println(someFunction)
但现在我被卡住了,不知道如何调用 function。 Println 打印出类似 0x7f50a5f9cec0 的内容,带有 & 符号我得到类似 0xc0000b2018 的内容,并且带有星号我得到“someFunction 的无效间接(类型 unsafe.Pointer)”。 我怎样才能将它转换为 function 调用?
谢谢你的帮助。
您必须在 /* */import "C" 部分中定义指向 function 的指针。 然后您可以使用 dlsym 调用的结果初始化指针。 然后你可以调用你的 function 像 C.your_function(...一些参数)。
顺便说一句,你可以尝试使用我的 go-dl package 来简化它https://github.com/sudachen/go-dl
go-dl 使用可以找到共享库的位置的声明性规范。 例如,我们想在系统库中搜索共享库,一些自定义位置,然后如果没有找到下载和/或从缓存加载。
so := dl.Load(
// firstly do search for system libraries
dl.System("libsdk.so"),
// then in the some custom place,
// it can be specified many times for different places
dl.Custom("/opt/sdk/libsdk.so"),
// in download cache
dl.Cached("sdk/sdk.so"),
// if nothing found download to cache and use cache
dl.LzmaExternal(urlbase+"sdk.so.xz"))
但是,您仍然必须定义 C function 指针以通过 SO.Bind(...) 方法绑定库符号。 尝试查看测试以获取有关如何使用它的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.