有时候为了定位系统的软件bug或是一些标准库函数无法满足需求,我们往往希望能够实现一个自己定义的接口函数,但是代码那么多,如果将原接口一一替换,将会是一件多么痛苦的事情。
好在gcc在链接的时候提供了一个比较简单又非常实用的方法:--wrap=symbol,它可以使链接器在链接symbol符号时优先查找__wrap_symbol,查找不到时才会链接原始的symbol符号,更加详细的说明可以参考man ld。
下面通过举一个替换库函数malloc的例子进行说明:
1. 首先实现一个自定义的__wrap_symbol函数__wrap_malloc:
点击(此处)折叠或打开
-
/********* test.c *********/
-
-
void *__wrap_malloc(size_t size)
-
{
-
printf("My malloc function!\n");
-
return __real_malloc(size);
-
}
-
-
int main(int argc, char *argv[])
-
{
-
char *p = (char *)malloc(16);
-
free(p);
-
-
return 0;
- }
这里需要注意两点:
1) 当需要调用真正的malloc函数时,需要使用__real_malloc();
2) 如果需要指定多个替换函数,需要写明多个链接选项,比如要替换malloc和free,那么编译时需要这么写:gcc test.c -o test -Wl, --wrap=malloc -Wl, --wrap=free;