【问题标题】:using cgo to hook syscall "fork"使用 cgo 挂钩系统调用“fork”
【发布时间】:2021-04-28 23:43:07
【问题描述】:

我正在尝试使用 Go 在 Linux 中挂钩 fork 系统调用。

package main

/*
#include <unistd.h>
*/
import "C"

import (
    "fmt"
    "os"

    "github.com/rainycape/dl"
)

func main() {}

//export fork
func fork() C.pid_t {
    lib, err := dl.Open("libc", 0)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    defer lib.Close()
    var old_fork func() C.pid_t
    lib.Sym("fork", &old_fork)
    return old_fork()
}

当我以LD_PRELOAD 编译和运行时,发生恐慌

panic: reflect.MakeFunc: value of type `int32` is not assignable to type main._Ctype_int

【问题讨论】:

  • 看起来这个dl 包希望您使用int 类型作为fork 的返回类型,而不是C.pid_t。 (也就是说,在fork 前面挂个钩子会有问题。)
  • 你不能用 Go 运行时 fork 一个进程,所以使用 Go 去挂钩 fork 将无法正常工作。

标签: linux go cgo ld-preload


【解决方案1】:

你应该设置一些指令来运行它。请查看其官方文档。 using cgo - Golang official doc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    相关资源
    最近更新 更多