我有一个实现malloc
的库。我想用一个自定义的malloc函数覆盖这个函数,然后调用库的malloc函数。
如何在不丢失库中的功能的情况下重新定义符号malloc
?
答案 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;
}