Chinaunix首页 | 论坛 | 博客
  • 博客访问: 232382
  • 博文数量: 27
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 213
  • 用 户 组: 普通用户
  • 注册时间: 2015-06-10 22:38
文章分类

全部博文(27)

文章存档

2016年(1)

2015年(26)

分类: LINUX

2015-08-12 22:52:47

    最近工作中遇到了一个替换库函数的需求,隐约记得以前看到过一个与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;

阅读(5102) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~