最近在研究应用申请内存时的行为,这时候需要hack掉glibc的malloc和free等内存申请操作。用自己写的钩子函数统计malloc和free的频次和大小,以便于解决问题。
一、原理
linux调用C库中的函数,使用动态库时,环境变量 LD_PRELOAD 所指定程序(动态库)在运行时会优先加载,这个动态库中的符号优先级最高,该库中的函数将会替换掉 glibc 中的相关函数,例如 malloc() 和free()。可以将内存管理库替换为 jemalloc 或者 tcmalloc 。
LD_PRELOAD,是个环境变量,用于动态库的加载,动态库加载的优先级最高,一般情况下,其加载顺序为LD_PRELOAD > LD_LIBRARY_PATH > /etc/ld.so.cache > /lib>/usr/lib。
二、hook函数
2.1 编写内存申请测试代码
先写一个内存申请函数malloc.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void) {
printf("enter\n");
void *p = malloc(1);
free(p);
printf("left,%p\n", p);
}
执行编译命令,生成malloc执行文件: