函数名__wrap_symbol

symbol也是一个函数,那么编译的时候如果添加了链接参数--wrap,函数调用symbol时,会调用到__wrap_symbol函数.

另外还有一个相关函数__real_symbol,只声明不定义的时候,会对其调用到真正的symbol函数。

void * __wrap_symbol(const char *fileName){
    printf("__wrap_ \n");
    return __real_symbol( fileName);
}

 

#include <stdio.h>
#include <stdlib.h>
 
void* __wrap_malloc(size_t size) 
{
    printf("__wrap_malloc called\n");
 
    return __real_malloc(size); //调用真正的malloc
}
 
int void(void)
{
    void *mem=malloc(16);
    memset(mem, 0, 16);
    free(mem);
 
    return 0;
}

编译时加上参数--wrap

gcc -Wl,--wrap,malloc -o malloc_test tect.c

 

在使用GCC编译器时,如果不想工程使用系统的库函数,例如在自己的工程中可以根据选项来控制是否使用系统中提供的malloc/free, new/delete函数,可以有两种方法:

(1). 使用LD_PRELOAD环境变量:可以设置共享库的路径,并且该库将在任何其它库之前加载,即这个动态库中符号优先级是最高的。

(2). 使用GCC的--wrap选项:对symbol使用包装函数(wrapper function),任何对symbol未定义的引用(undefined reference)会被解析成__wrap_symbol,而任何对__real_symbol未定义的引用会被解析成symbol。即当一个名为symbol符号使用wrap功能时,工程中任何用到symbol符号的地方实际使用的是__wrap_symbol符号,任何用到__real_symbol的地方实际使用的是真正的symbol。注意:当__wrap_symbol是使用C++实现时,一定要加上extern “C”,否则将会出现”undefined reference to __wrap_symbol”。

 

https://blog.csdn.net/fengbingchun/article/details/82947673

https://blog.csdn.net/q2519008/article/details/88661486

posted @ 2020-05-06 14:59  钰蛋  阅读(627)  评论(0编辑  收藏  举报