@(linux 编程)
翻看 CSAPP 看到库函数打桩,记录下。
linux 链接器支持库打桩(library interpositioning), 允许我们截获共享库的调用,执行自己的代码,通过这个机制,可以给程序调试带来很多便利。
库打桩实现有三种:
- 编译时打桩
- 链接时打桩
- 运行时打桩
以下,参照书中例子,以 malloc 和 free 两个库函数的调用作为例子, 添加调用该函数时打印调试信息,以上述提到的三种方式实现打桩
ubuntu下测试代码
测试目标代码, 申请内存,赋值后答应,释放内存
#include<stdio.h>
#include"malloc.h"
int main()
{
int *p = malloc(sizeof(int));
*p = 12;
printf("p = %d\n", *p);
free(p);
return 0;
}
编译时打桩
编译时打桩通过在编译时指定 include 路径,告诉C预处理器在搜索系统目录前,先查看当前目录,由于当前目录有malloc.h
, 停止继续搜索
实现桩代码:
malloc.h
#ifndef _MALLOC_H
#define _MALLOC_H
#define malloc(size) mymalloc(size)
#define free(ptr) myfree(ptr)
void *mymalloc(size_t size);
void my