如何用C语言重写函数(系统调用)



在许多脚本语言中,我们都有这样的编程方法:

首先,有一个名为func:的函数

void func()
{
}

其次,我想在客户端调用此函数时记录一些信息,但我不想修改函数,这样我就可以做一些类似的事情:

void (*pfunc)(void) = func;
void func()
{
    log("Someone call fund");
    pfunc();
}

之后,任何调用fund的人都会调用我的"override"函数。这在许多脚本语言中都可以。我能用C语言做同样的事情吗?如何对其进行编码?

我想用这个方法在一些第三方库中做一些工作,所以我必须做一些影响链接过程的事情,而不仅仅是编译过程。

您可以用宏对其进行编码,在您的简单情况下是

#define func()                
do {                          
    log("Someone called func"); 
    func();                   
} while(0)

在宏的展开中,宏不是递归展开的。

对于更复杂的情况,您可以实现一个函数和一个宏。在一个".h"文件中,你会放:

void func_annotated(void);
#ifdef DEBUG
# define func() func_annotated()
// or if the function takes parameters
// # define func(...) func_annotated(__VA_ARGS__)
#endif

在".c"文件中,然后将实现

void func_annotated(void)
{
    log("Someone called func");
    (func)();
}

在这里,func周围的额外()确保它总是使用实函数。

也许您正在寻找一个库插入器。您可以在文件中定义自己的函数,并使用这些函数而不是系统调用来调用要记录调用的程序。

例如,插入ls:进行的一些系统调用

$ LD_PRELOAD=/your/own/functions/file.so ls -l

它更适合于无法更改调用要记录的函数的程序代码(可能是因为它不可用)的情况。

在这种情况下不需要使用函数指针。您可以让函数func为您想要记录的任何内容获取参数。重写也是如此,它不需要是函数指针(除非您计划稍后更改重写函数)。此外,在这种情况下,它将创建一个无限循环,因为函数指针指向func函数。此外,我甚至不确定在声明函数之前是否允许使用func作为函数指针。

我会尝试这样的方法,这会记录一个整数,但你可以用它来记录你想要的任何东西。

void func(int value)
{
    printf("%dn", value);
    anotherFunc(value);
}

其中CCD_ 7是完全不同的函数。就像我前面说的,如果你想更改anotherFunc()调用的函数,那么使用函数指针是有意义的,否则就不需要了。

最新更新