库函数替换 --wrap=symbol

5090阅读 0评论2015-08-12 夕阳下的孤影
分类:LINUX

    最近工作中遇到了一个替换库函数的需求,隐约记得以前看到过一个与ld链接相关的方法,但是已经完全忘记了具体的实现。今天又想起这回事,终于在网上找到了,在这里做个记录,方便以后查找。

    有时候为了定位系统的软件bug或是一些标准库函数无法满足需求,我们往往希望能够实现一个自己定义的接口函数,但是代码那么多,如果将原接口一一替换,将会是一件多么痛苦的事情。
    好在gcc在链接的时候提供了一个比较简单又非常实用的方法:--wrap=symbol,它可以使链接器在链接symbol符号时优先查找__wrap_symbol,查找不到时才会链接原始的symbol符号,更加详细的说明可以参考man ld。

    下面通过举一个替换库函数malloc的例子进行说明:
    1. 首先实现一个自定义的__wrap_symbol函数__wrap_malloc:

点击(此处)折叠或打开

  1. /********* test.c *********/

  2. void *__wrap_malloc(size_t size)
  3. {
  4.     printf("My malloc function!\n");
  5.     return __real_malloc(size);
  6. }

  7. int main(int argc, char *argv[])
  8. {
  9.     char *p = (char *)malloc(16);
  10.     free(p);
  11.     
  12.     return 0;
  13. }
    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;

上一篇:Linux中虚拟地址转物理地址的方法
下一篇:用户态进程访问物理内存的方法