当前位置:   article > 正文

Linux C 利用链接器特性实现打桩函数(替换已有库函数)_如何让调用的库函数不是桩函数

如何让调用的库函数不是桩函数

Linux C 利用链接器特性实现打桩函数(替换已有库函数)

很多时候,可能需要替换已有库函数,或者对其库函数进行修改。
为了避免对那些静态链接库或者动态链接库文件大动干戈,我们可以使用ld提供的–wrap选项。

例如,想把所有的malloc函数都作修改,以便让malloc出的内存都是32字节对齐的。
我们可以给ld传选项“­­wrap=malloc”, 告诉ld,我们将替换名称为malloc的函数。
接着再如下定义一个新的malloc函数:

  1. void * __wrap_malloc( size_t size) {
  2. void* result;
  3. result=memalign(32, size);
  4. return result;
  5. }

可以看到,程序中有个类似库函数名称的__wrap_malloc。
ld在遇到__wrap选项后,会使用__wrap_malloc函数名替换所有对malloc的调用。
并以此实现替换的作用。

那麽,如果还想调用原函数怎么办呢?
可以使用__real_malloc,这个函数名称就对应了原来的malloc。
每次调用malloc时都打印生成的指针地址。

  1. void * __wrap_malloc( size_t size) {
  2. void* result;
  3. result= __real_malloc( size);
  4. printf("Malloc: allocate %d byte mem, start at %p", size, result);
  5. return result;
  6. }

附完整程序:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void * __wrap_malloc( size_t size) {
  4. void* result;
  5. //result= __real_malloc( size); result = memalign(32, size);
  6. printf("Malloc: allocate %d byte mem, start at %p", size, result);
  7. return result;
  8. }
  9. int main ()
  10. {
  11. int i,n;
  12. char * buffer;
  13. printf ("How long do you want the string? ");
  14. //scanf ("%d", &i); i = 200;
  15. buffer = (char*) malloc (i+1);
  16. if (buffer==NULL) exit (1);
  17. for (n=0; n<i; n++)
  18. buffer[n]=rand()%26+'a';
  19. buffer[i]='\0';
  20. printf ("Random string: %s\n",buffer);
  21. free (buffer);
  22. return 0;
  23. }

编译选项:

$gcc test_malloc.c -Wl,--wrap=malloc

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/160533
推荐阅读
相关标签
  

闽ICP备14008679号