分析共享库以获取重复的代码链接

时间:2013-10-17 08:19:51

标签: c++ dll code-analysis binaryfiles

我们有一个包含>的大型代码库40个项目(在VS lingo中)创建了几个DLL / SO(~15)和一个EXE。

有一些实用程序项目静态链接以创建EXE,并且也被大多数DLL使用。理想情况下,我们希望这些Utility项目也是DLL,这样代码就不会在每个依赖它们的DLL中重复。

是否有任何工具可以对DLL进行二进制分析,以查看存在多少重复(代码+数据)?对此进行估算会有所帮助。

2 个答案:

答案 0 :(得分:3)

没有工具,只有你耳朵之间的工具。您希望专注于链接静态库的项目,找到多次使用相同静态库的项目。这是假设一个函数可以多次链接的起点。

然后您可以使用链接器的/ VERBOSE选项,它会显示从静态库链接到哪些函数。该选项有很多输出,但它很简单,易于解析。

作为替代方案,请考虑使用链接器的/ MAP选项生成.map文件。其中详细显示了哪些函数链接到最终可执行文件中。具有相同的功能在不同的.map文件中出现不止一次是您的主角,将它放在DLL中可能是有益的。用您最喜欢的脚本语言编写一个小程序来处理/ VERBOSE输出或.map文件并找到匹配是可行的。

答案 1 :(得分:1)

好吧,在Unix / Linux / OSX系统上你会做类似

的事情
for eachfile in *.exe *.dll ; do
    nm $eachfile | sort | uniq > $eachfile.symbols.txt
done

cat *.symbols.txt | sort | uniq -c > count-duplicate-symbols.txt

sort -r count-duplicate-symbols.txt | less

前三行说“将符号转储到当前目录中的每个.exe和.dll文件中;将每个转储存储在一个单独的文件中。顺便说一下,如果同一行在单个文件中出现多次,只需存储一次。“

cat开头的行显示“计算每行显示所有我们刚刚生成的文件的次数。编写一个名为count-duplicate-symbols.txt的新文件,其中包含重复的行与他们的计数。“

最后一行说“按重复次数排序文件(按升序排列),并将其传送到终端,以便我可以阅读。”

如果您想查看哪些源文件包含有问题的重复符号,您可以使用grep

请注意,这种方法可能不适用于static符号(函数和变量),并且可能会对内联函数产生误报,这些函数应该出现在任何地方。您可以过滤掉linkonce部分中出现的符号,使用c++filt等输出相同的打印等。

其中一些工具绝对适用于Windows。我不知道他们都是。