提问人:MauriceLambert 提问时间:10/5/2023 最后编辑:MauriceLambert 更新时间:10/5/2023 访问量:49
如何在Go中从指针调用共享对象函数(动态加载)?
How to call shared object function (loaded dynamically) from pointer in Go?
问:
我尝试从 Go 中调用一些共享对象函数。我不想编写 C 注释代码来为所有函数构建 CGO 接口。
我是这样写我的共享对象的:
#include <stdio.h>
void greet(char* name) {
printf("Hello, %s!\n", name);
}
我用以下命令编译它: .gcc -shared -fPIC -o libgreet.so greet.c
我的 Go 代码调用函数:greet
package main
// #cgo LDFLAGS: -ldl
// #include <dlfcn.h>
// #include <stdlib.h>
import "C"
import (
"unsafe"
"fmt"
)
func main() {
so_name := C.CString("./libgreet.so")
defer C.free(unsafe.Pointer(so_name))
function_name := C.CString("greet")
defer C.free(unsafe.Pointer(function_name))
library := C.dlopen(so_name, C.RTLD_LAZY)
defer C.dlclose(library)
function := C.dlsym(library, function_name)
greet := (*func(*C.char))(unsafe.Pointer(&function))
fmt.Println("%p %p %p %p\n", greet, function, unsafe.Pointer(function), unsafe.Pointer(&function))
(*greet)(C.CString("Bob"))
}
当我启动可执行文件时,我收到错误。SIGSEGV
我尝试使用 gdb 调试它,打印的指针似乎很好(与 gdb 中的值相同)。分段错误出现在包含的指令上(可能不是内存地址)。x greet
0x47dde4 <main.main+548> call r8
$r8
0x10ec8348e5894855
你知道我该如何解决这个错误吗?在 Go 中调用共享对象函数的方法没有注释为 CGO 语法的 C 代码(我找不到任何文档可以做到这一点)?
答: 暂无答案
评论