剖析DLL / LIB鼓胀症(Profiling DLL/LIB Bloat)

2019-08-22 16:42发布

我继承了VS2005一个相当大的C ++项目,编译成约5MB的DLL。 我想这样它加载在网络上谁使用它从一个慢速网络共享客户更快地降低库的大小。

我知道如何通过分析代码,包括和项目设置要做到这一点,但如果有任何可用的工具,可以更容易地找出哪些部分代码占用了大部分的空间,我想知道。 有什么办法来产生的DLL布局的“个人资料”? 什么是消费图书馆图像在空间和多少的报告?

Answer 1:

当你建立你的DLL,你可以通过/ MAP链接器,来把它生成包含所产生的图像中的所有符号的地址映射文件。 你可能会不得不做一些脚本来计算每个符号的大小。

使用“线”工具来扫描您的DLL可能揭示意外或不使用打印的字符串(如资源,RCS的ID, __FILE__宏,调试消息,断言等)。

另外,如果你不是已经有编译/ O的启用,这是值得一试。



Answer 2:

如果你的最终目标是只修剪DLL的大小,然后调整编译器设置后,你可能会通过运行您的DLL得到最快的结果UPX 。 UPX为DLL和EXE中优异的压缩实用程序; 它也是开源与非病毒牌照,所以也没关系商业/闭源产品中使用。

我只有它打开了在最高压缩设置(蛮力选项)病毒预警,因此,如果您使用比一个较低的设置,你可能会被罚款。



Answer 3:

虽然我不知道任何二进制大小廓线仪,你可以或者找什么对象文件(.OBJ)是最大的 - 这让你至少在您的问题点是一个想法。
当然,这需要足够模块化项目。



Answer 4:

你也可以尝试,而不是静态链接使用的DLL。 事实上,当库被链接静态链接中删除从最终的exe所有未使用的功能。 有时最终的exe是只稍微大,你没有任何更多的DLL。



Answer 5:

如果因为它的出口C ++函数特别长错位的名称您的DLL是这么大,另一种是使用.DEF文件按顺序(使用导出功能,没有名字NONAME在.DEF文件)。 有点脆,但它减少了大小的DLL,EXE大小和加载时间。

例如参见http://home.hiwaay.net/~georgech/WhitePapers/Exporting/Exp.htm



Answer 6:

考虑到所有的obj文件都差不多大小,假设你使用预编译头,尝试创建一个空着的OBJ文件,看看它是多么大。 这会给你的obj每个那是由于PCH编译比例的想法。 链接器将能够有删除所有重复的,顺便说一句。 另外,您可以尝试禁用PCH,以便OBJ文件会给你的主要罪魁祸首是其中一个更好的指标。



Answer 7:

所有好的建议。 我做的就是地图文件,然后只是眼球了。 我已经在过去发现的那种事情是空间的很大一部分是采取由一些变量的地方被宣布为具有类型,听起来像它会节省一些编码的事实带来的一个或多个类别库努力,但不是真有必要。

像MFC(还记得吗?)他们有一个包装类像控制,字体等,它们的Win32提供的每一件事情去走一走。 那些采取一吨的空间,你并不总是需要他们。

可以采取一吨的空间的另一件事是,你可以不管理的集合类。 另一种是COUT你不使用I / O例程。



Answer 8:

我会建议下列之一:

报道 -你可以运行在检测一些无用代码,希望覆盖工具

缓存 -缓存在客户端的dll初始活化法制

分裂 -该dll拆分成几个较小的dll,开始引导DLL的应用程序和应用程序启动后,下载其他DLL

编译和链接-使用更小的运行时库,与尺寸优化编译器等。看到这个链接更多的建议。

压缩 -如果在DLL中有数据,或者大量的资源,可以压缩他们,只有在下载或在运行时解压缩。



文章来源: Profiling DLL/LIB Bloat