又来了个新公司,新产品用了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进制数
如何导出并分析Linux静态库之间的依赖
又来了个新公司,新产品用了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进制数