最近工作中遇到了一个替换库函数的需求,隐约记得以前看到过一个与ld链接相关的方法,但是已经完全忘记了具体的实现。今天又想起这回事,终于在网上找到了,在这里做个记录,方便以后查找。
有时候为了定位系统的软件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;
-
}
2. 指定链接时要替换的函数:gcc test.c -o test
-Wl, --wrap=malloc,其中-Wl是链接选项。这样当malloc函数调用malloc时就会就替换为__wrap_malloc函数。
这里需要注意两点:
1) 当需要调用真正的malloc函数时,需要使用
__real_malloc();
2) 如果需要指定多个替换函数,需要写明多个链接选项,比如要替换malloc和free,那么编译时需要这么写:
gcc test.c -o test -Wl, --wrap=malloc -Wl, --wrap=free;
阅读(5102) | 评论(0) | 转发(0) |