gcc -Wl,--wrap,malloc 替换系统函数
转载于:https://blog.csdn.net/weixin_41041321/article/details/83414286
GNU链接器就提供了一个好用的方法:
–wrap=symbol
函数名为“__wrap_symbol”,且称其为包装函数,“symbol”是一个函数名,大致执行过程是这样的:当调用“symbol”函数时,如果“symbol”函数未定义的话就会调用“__wrap_symbol”函数;“__real_symbol”也是个相关的函数,当其只声明不定义的话,我们对其的调用将调用真正的“symbol”函数;当然,我们还要添加编译链接参数:
-Wl,–wrap,symbol
下面以常用的malloc函数为例说明:
// wrap.c
#include <stdio.h>
#include <stdlib.h>
void* __real_malloc(size_t size); // 只声明不定义__real_malloc
void* __wrap_malloc(size_t size) // 定义__wrap_malloc
{
printf("__wrap_malloc called, size:%zd\n", size); // log输出
return __real_malloc(size); // 通过__real_malloc调用真正的malloc
}123456789
下面是测试用例:
// test.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* c = (char*)malloc(sizeof(char)); // 调用malloc
printf("c = %p\n", c);
free(c); // 调用free,防止内存泄漏
return 0;
}12345678910
下面是编译链接过程:
gcc -c wrap.c test.c
gcc -Wl,--wrap,malloc -o test wrap.o test.o // 链接参数-Wl,--wrap,malloc12
结果查看:
./test
__wrap_malloc called, size:1
c = 0x60d010
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?