如何导出并分析Linux静态库之间的依赖

2024-12-26 16:07:23
标签: symbol shell python graphviz

又来了个新公司,新产品用了1128个静态库。现在想做一个静态库依赖关系示意图。

想法,先输出所有符号,找出其中T和U的符号,在此基础上,去分析相互之间的引用关系。

先从.a到符号

find . -name "*.a" | xargs -P `nproc` -I {} sh -c 'nm {} > $(basename {} .a).full_symbol'

并行产生1128个文件。

每个里面形如

XXX.o:

          U undefinedFunc1

xxxx   T definedFunc2

xxxx   d/t symbol

这样的其他符号。

然后从一个full_symbol生成两个.USYM和.TSYM分别只包括U和T的符号

find . -name "*.full_symbol" | xargs -n 1 -P `nproc` dumpTSymbol.ksh

#!/bin/sh

defined_symbol_file=$(basename $1 .full_symbol).TSYM

cat $1 | awk '/^[[:digit:]]+[[:space:]]*T|\.o:$/' > $defined_symbol_file

 

find . -name "*.full_symbol" | xargs -n 1 -P `nproc` dumpUSymbol.ksh

#!/bin/sh

undefined_symbol_file=$(basename $1 .full_symbol).USYM

cat $1 | awk '/^[[:space:]]*U|\.o:$/' > $undefined_symbol_file

这样就能导出分别两个文件,其中一个只有.o和T,一个只有.o和U

接着生成一个脚本preprocess.ksh

sed -i '/__x86.get_pc_thunk./d' *.TSYM

sed -i '/_GLOBAL_OFFSET_TABLE_/d' *.USYM

sed -i '/__cxa_/d' *.USYM

sed -i '/__gxx_personality_v0/d' *.USYM

sed -i '/_Unwind_Resume/d' *.USYM

sed -i '/__dso_handle/d' *.USYM

sed -i '/__stack_chk_fail_local/d' *.USYM

直接把不关注的文件内容去掉。

下一步,运用Python,读取这些文件,将中间结果存成结构化的数据,按目录生成.json文件。

比如zoaui.a最后的结果会有zoaui.a.T.json和zoaui.a.U.json,分别存a到T和U符号的映射。然后建立zoaui.a的子文件夹,里面存每个.o对应的T.json和U.json。这样以后要做.o级别的符号分析就有了原始数据。

如何存这些json,以及后面读.json就不展示代码了,公司的内网环境实在没法贴代码,这也是目前和外企最大的区别。美其名曰,代码安全,个人觉得人为创造壁垒,效率大降。

所以同样时间,在外企,如有屠龙刀倚天剑,国产软件要追,太难了。

后面最后一步分析的逻辑,也不贴了,读取数据以后,从U找T或者从T找U,都只是算法问题了,不影响功能了。用Graphviz生成gv文件,然后发现没有PDF,看不了,现在换了

dot.render(

'output', format='png', view=True) 生成也非常慢,直接生成PNG,试试吧。装个Graphviz也那么困难,明明有工具,偏要加点手动的操作。累!

今天发现个Bug

defined_symbol_file=$(basename $1 .full_symbol).TSYM

cat $1 | awk '/^[[:digit:]]+[[:space:]]*T|\.o:$/' > $defined_symbol_file

这里

cat $1 | awk '/^[[:digit:]]+[[:space:]]*T|\.o:$/' > $defined_symbol_file

要改成

cat $1 | awk '/^[0-9a-f]+[[:space:]]*T|\.o:$/' > $defined_symbol_file

来支持16进制数

 

 


 

阅读(0) 收藏(0) 转载(0) 举报/Report
相关阅读

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有