如何在Go中从指针调用共享对象函数(动态加载)?

How to call shared object function (loaded dynamically) from pointer in Go?

提问人:MauriceLambert 提问时间:10/5/2023 最后编辑:MauriceLambert 更新时间:10/5/2023 访问量:49

问:

我尝试从 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 greet0x47dde4 <main.main+548> call r8$r80x10ec8348e5894855

你知道我该如何解决这个错误吗?在 Go 中调用共享对象函数的方法没有注释为 CGO 语法的 C 代码(我找不到任何文档可以做到这一点)?

go segmentation-fault 指针 函数 调用 shared-objects

评论


答: 暂无答案