【发布时间】: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