最近在实验中需要分析程序中的堆变量内存分配情况,一开始自己的实现是采用llvm IR Pass修改的方式,后来在OSDI的论文中发现相关的方法采用的是LD_PRELOAD的方式实现,一开始认为这种方法会更加简单,于是进行了实现,结果发现各有特点。
1. LLVM IR 方式
2. LD_PRELOAD方式
LD_PRELOAD
的全进程级别:
LD_PRELOAD
是基于全进程级别的动态链接符号重定向。
启动加载时加载指定的.so文件,然后后续所有的调用都会使用so文件中提供的实现,这包括引用程序代码、第三方库、libc
比如:重定向了一个malloc,记录程序中的malloc地址然后使用LD_PRELOAD的方式进行重定向。
1 |
|
理论以上代码值调用一个malloc,但是拦截重定向以后发现有3个malloc,不注释代码中的printf函数,还会多出一个malloc。
这样的全进程级别特性可以采集到lib c本身的特性,但是也可能会对程序分析不必要的麻烦,比如我本身只想分析应用程序级别的事务,实现程序代码中的过滤可以通过调用栈过滤等方式实现。