如何用自定义代码包装库函数?

时间:2014-04-15 08:23:57

标签: c function override

我有一个实现malloc的库。我想用一个自定义的malloc函数覆盖这个函数,然后调用库的malloc函数。

如何在不丢失库中的功能的情况下重新定义符号malloc

3 个答案:

答案 0 :(得分:2)

GNU链接器提供--wrap symbol标志以围绕现有函数包装自定义函数。

你可以在这里看到,最后一面旗帜:http://ieee.uwaterloo.ca/coldfire/gcc-doc/docs/ld_3.html#SEC3

--wrap symbol
     

使用符号的包装函数。对symbol的任何未定义引用都将解析为__wrap_symbol。对__real_symbol的任何未定义引用都将解析为symbol。这可以用于为系统功能提供包装器。包装函数应该被称为__wrap_symbol。如果希望调用系统函数,则应调用__real_symbol。这是一个简单的例子:

void *
__wrap_malloc (int c) {
    printf ("malloc called with %ld\n", c);
    return __real_malloc (c);
}
     

如果您使用--wrap malloc将其他代码与此文件相关联,则所有对malloc的调用都会调用函数__wrap_malloc__real_malloc中对__wrap_malloc的调用将调用真实的malloc函数。您可能还希望提供__real_malloc函数,以便没有--wrap选项的链接将成功。如果这样做,则不应将__real_malloc的定义放在与__wrap_malloc相同的文件中;如果这样做,汇编器可以在链接器有机会将其包装到malloc之前解析调用。

答案 1 :(得分:1)

使用库函数的名称创建新函数不是一个好习惯。如果你想创建这样一个函数,你的新函数将正常工作,但你不能使用库函数。如果你想创建自己的printf()版本,你可以这样做,但你不能使用原来的printf()函数,因为你要覆盖。

答案 2 :(得分:0)

如果两个函数具有相同的原型,则可以使用函数指针

#include <stdlib.h>

void *my_malloc(size_t len) {
    return malloc(len);
}

int main(void) {
    void *(*malloc_pointer)(size_t);

    malloc_pointer = my_malloc;
    malloc_pointer(42); // uses my_malloc;
    malloc_pointer = malloc;
    malloc_pointer(42); // uses malloc;

    return 0;
}