最近在实验中需要分析程序中的堆变量内存分配情况,一开始自己的实现是采用llvm IR Pass修改的方式,后来在OSDI的论文中发现相关的方法采用的是LD_PRELOAD的方式实现,一开始认为这种方法会更加简单,于是进行了实现,结果发现各有特点。

1. LLVM IR 方式

2. LD_PRELOAD方式

代码

LD_PRELOAD的全进程级别:

LD_PRELOAD是基于全进程级别的动态链接符号重定向。

启动加载时加载指定的.so文件,然后后续所有的调用都会使用so文件中提供的实现,这包括引用程序代码、第三方库、libc

比如:重定向了一个malloc,记录程序中的malloc地址然后使用LD_PRELOAD的方式进行重定向。

1
2
3
4
5
6
7
8
#include <stdio.h>
#include <stdlib.h>
int main() {
void* p = malloc(64);
// printf("p: %p\n", p);
free(p);
return 0;
}

理论以上代码值调用一个malloc,但是拦截重定向以后发现有3个malloc,不注释代码中的printf函数,还会多出一个malloc。

image-20250729180628387

这样的全进程级别特性可以采集到lib c本身的特性,但是也可能会对程序分析不必要的麻烦,比如我本身只想分析应用程序级别的事务,实现程序代码中的过滤可以通过调用栈过滤等方式实现。


本站由 Zane Jiang 使用 Stellar 1.33.1 主题创建,一款很棒的 Hexo 主题!

总访问 次 || 本页访问
总访客 人 || 本页访客