重载fork()

我重载了fork()系统调用,并使用RTLD_NEXT创build了我自己的fork()版本。 也就是dlsym(RTLD_NEXT, fork) 。 这将打我的版本的叉子。 在这之后,我想复制实际fork()系统调用的任务,即创buildsubprocess并返回pid,以及一些更多的附加function。

我无法弄清楚如何做到这一点。 我检查了fork() (fork.c)的内核源代码,并没有弄清楚。

这样做:

 dlsym(RTLD_NEXT,fork); int fork(void) { int pid=_fork(); // Trying to call actual fork does not work return pid; } 

我怎样才能做到这一点? 这里是fork的内核源代码链接: http : //lxr.linux.no/linux+v2.6.32/kernel/fork.c#L10

编辑(从评论拉入)

我正在使用泄漏检测工具,并且此子工具在subprocess删除由父级分配的内存时检测到双重空闲。 为了克服这个,我将重写fork() ,并且每当有一个fork() ,父级的内存分配表将被复制到子级。

Solutions Collecting From Web of "重载fork()"

在包含<sys/syscall.h>之后,您应该能够使用syscall(SYS_fork)实际的fork 。 请参阅syscall(2)

你不会从fork的内核源代码中得到任何有用的东西。 你的代码不会被允许去做内核所做的事情,不管你管理的是什么图书馆。 如果不编写内核模块,这是一个难以逾越的难题。

fork所有库代码都是设置好的,并执行一个特殊指令,切换到内核的fork代码执行的内核模式。 有一种方法可以把这个特殊的指令放在你自己的代码中。 这是syscall功能。 由于fork没有参数,所以使用这个函数来进行系统调用应该相对容易一些。

但这不是我推荐你做的。 我建议你这样做:

 typedef int (*forkfunc_t)(void); int fork(void) { forkfunc_t sysfork = (forkfunc_t)dlsym(RTLD_DEFAULT, "fork"); return sysfork(); } 

基本上,无论你做什么共享库hackery,你应该基本上找到一些方法来检索fork函数以前的值,然后用你自己的替换。

既然你是黑客攻击,反正,为什么不只是使用宏

 #define fork() (spoon(),fork()) 

要么

 #define fork() spoon(fork()) 

在那里spoon是功能,做你想完成的事情。

预处理器保证不进行递归,并将fork单独放在扩展中。