编译时打桩

编译时打桩是最简单的库打桩方式,利用C语言的预处理宏机制实现函数名替换。

原理:在头文件中使用 #define 预处理指令,将所有对标准库函数的调用替换为对自定义函数的调用。

示例

#define malloc(size) mymalloc(size)
#define free(ptr) myfree(ptr)

将这段宏定义放在头文件中,并在需要打桩的源文件中包含它,则所有 mallocfree 调用都会被替换为 mymallocmyfree

工作流程:预处理器在编译前扫描代码,发现 malloc(args) 时直接替换为 mymalloc(args),编译器看到的已经是替换后的函数名。自定义函数内部可以实现额外的调试逻辑(如计数、内存泄漏检测),并通过调用真正的 malloc 来完成实际分配。

优点:实现简单,无需修改链接过程。缺点:需要访问被打桩程序的源代码,且必须确保宏定义在调用之前生效。适用于调试版本的快速插桩。

链接到