登录
首页 >  Golang >  Go问答

Cgo 在等待 x_cgo_notify_runtime_init_done 以返回 Go 运行时

来源:stackoverflow

时间:2024-02-25 23:45:26 189浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《Cgo 在等待 x_cgo_notify_runtime_init_done 以返回 Go 运行时》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

我正在尝试自己编写 runc exec,但在实现 nsenter 模块时遇到问题。

这里是示例代码:

package main
import "fmt"
/*
#define jump_parent 0x00
#define jump_child  0xa0
#define _gnu_source
#include 
#include 
#include 
#include 
#include 

char child_stack[4096] __attribute__ ((aligned(16)));

int child_func(void *arg) {
    jmp_buf* env  = (jmp_buf*)arg;
    longjmp(*env, jump_child);
}

__attribute__((constructor)) void init(void) {
    printf("init...\n");
    jmp_buf env;
    switch(setjmp(env)) {
        case jump_parent: 
        printf("jump_parent\n");
            int child_pid = clone(child_func, child_stack, clone_parent, env);
            printf("child_pid: %d\n", child_pid);
            exit(0);
        case jump_child:
            printf("jump_child\n");
            return;
    }
}
*/
import "c"

func main() {
    fmt.println("main...")
}

这是 centos7 中的输出:

[root@localhost cgo-practive]# go build .
[root@localhost cgo-practive]# ls
cgo-practive  main.go
[root@localhost cgo-practive]# ./cgo-practive
init...
jump_parent
child_pid: 14348
[root@localhost cgo-practive]# jump_child
// program blocked here

然后我使用gdb找出被阻止的原因:

(gdb) list
28              exit(0);
29          case JUMP_CHILD:
30              printf("JUMP_CHILD\n");
31              return;
32      }
33  }
34  */
35  import "C"
36
37  func main() {
(gdb) info stack
#0  0x00007efd6f9684ed in __lll_lock_wait () from /lib64/libpthread.so.0
#1  0x00007efd6f966170 in pthread_cond_broadcast@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#2  0x00000000004862e6 in x_cgo_notify_runtime_init_done (dummy=) at gcc_libinit.c:69
#3  0x0000000000451070 in runtime.asmcgocall () at /usr/local/go/src/runtime/asm_amd64.s:637
#4  0x00007ffdec4b5c30 in ?? ()
#5  0x000000000044efd1 in runtime.malg.func1 () at /usr/local/go/src/runtime/proc.go:3289
#6  0x000000000044f886 in runtime.systemstack () at /usr/local/go/src/runtime/asm_amd64.s:351
#7  0x000000000042c5b0 in ?? () at /usr/local/go/src/runtime/proc.go:1146
#8  0x000000000044f719 in runtime.rt0_go () at /usr/local/go/src/runtime/asm_amd64.s:201
#9  0x0000000000000000 in ?? ()

看来程序是在x_cgo_notify_runtime_init_done中被屏蔽的,但是我对cgo不擅长,搞不清楚为什么被屏蔽。

谢谢。


解决方案


正如 man page 所说

所以你应该使用下面的代码

int child_pid = clone(child_func, &child_stack[4096], CLONE_PARENT, &env);

到这里,我们也就讲完了《Cgo 在等待 x_cgo_notify_runtime_init_done 以返回 Go 运行时》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>