一个静态分析调用关系的东西

这篇博客介绍了作者为了解决查看OpenCore中函数调用关系慢的问题,如何通过静态分析避免动态分析的复杂性。作者分享了自己用Perl编写的三个脚本(gen.sh、cg.pl、ac.pl)来枚举.so文件,生成调用关系,并提供了源代码链接。这些脚本用于生成和解析调用图,帮助理解函数间的调用层次。需要注意的是,脚本中有一个部分跳过了webcore,因为其体积过大且与当时的需求无关。
摘要由CSDN通过智能技术生成

    

    这是很长时间以前写的东西,当时在弄opencore里面的东西(好吧,我们公司反应比较慢,还在弄2.1里面的opencore)。用source insight看东西觉得还是有点慢,就想找找看有没有啥东西能直接把调用关系整个弄出来,于是找到这个 陈硕大牛写的
http://blog.csdn.net/Solstice/article/details/488865  
    动态分析的方法有点麻烦,还得把东西跑起来,于是想弄静态分析的,虽然有egypt这样的东西(Doxygen没有试用,为啥不试试?忘了),但是程序猿的毛病就是喜欢自己造轮子,正好自己没写过perl脚本,于是自己动手写一个出来。函数指针调用现在没办法,一般的虚函数还可以,好像还有个啥东西不行,也忘了。写完之后就去干别的东西了。这个东西也没怎么用,可能会有些bug。
    里面的那些类似于 non-virtual thunk什么的处理当时也没写注释,现在已经想不起来了(本来也是一知半解的,只记得大概和纯虚函数有关,但是再具体些就说不出来了,得重新去翻翻书、翻翻网什么的)。有半年的时间一直想补上但是就是因为重度拖延症一直没动手。发出来就是希望逼着自己赶紧把它补齐。
    共三个文件,gen.sh用来枚举.so目录下的所有文件,调用cg.pl生成一个叫callg.total的文本文件,里面记录的是每个函数里面调用的其他函数。ac.pl用来解析那个文件生成调用关系。现在是靠命令行来查询的,希望以后也把它生成一个调用图出来。
这个东西如果你要使用需要自己在三个文件里面指定.so的目录以及交叉编译链的位置。
希望有人用得上。
注意:17行那里把webcore给跳过去了,因为那个东西太大了,而我当时是用不上的


https://github.com/wnfx/callGraph.pl

===============gen.sh=====================

#!/bin/bash  

#下面三个需要自己指定位置
declare objd="/home/yk/work/ut6410-android2.1-v2.0/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-objdump" 
declare SoBase="/home/yk/work/ut6410-android2.1-v2.0s/out/target/product/ut6410/symbols/system/lib/" 
declare readelf="/home/yk/work/ut6410-android2.1-v2.0/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-readelf" 


for f in `ls $SoBase `
do 
  echo "disassembling $f and dumping rel information"
  $objd -d $SoBase$f > asm.tmp #-d disassemble
  $readelf -r -W $SoBase$f > elf.tmp # -r 
  echo "parsing ................ "
  
  ./cg.pl asm.tmp  $f elf.tmp | tee -a callg.total 
done

========================cg.pl=============================

#!/usr/bin/perl  
 
#use diagnostics;
 
my $fnasm = "asm.opencore.player";   
my $soname = "foo.so"; 
if(@ARGV[0])

   $fnasm = @ARGV[0]; 
}
if(@ARGV[1])

   $soname = @ARGV[1]; 
}
print $soname;

#这里跳过了webcore
exit if(index(lc($soname), "webcore") >= 0);
$fnasm = "<" . $fnasm;
print "\n\n";

#这里要自己指定位置
my $base = "/home/yk/work/ut6410-android2.1-v2.0/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值