2011-12-15 26 views
3

即时尝试编译一个尽可能小的dll,我减少了部分alignmnent,它节省了一些大小,并且我还用(-nostdlib)和所有优化删除了stdlib。现在我有一些问题在MinGW中构建最小DLL?

  1. “轮候册,-exclude-所有符号”删除所有符号,但保留出口目录下有服用大量的空间
  2. ,如果我使用LD-脚本绑定两个.data和.text部分放在一起,是否会使.reloc部分无用?据我所知.reloc用于从.text到.data的绝对地址,如果它们都在同一节中,所有的地址都是相对的?

谢谢。

回答

2

不要乱用部分,只需使用-fPIC标志来减少重定位(否则引用在x86上始终是绝对的)。您仍然会有一个.reloc,因为它用于链接。此外,请始终使用-Os和进行编译。

顺便说一句,你不应该有一个.data部分。如果你这样做是因为某些事情是错误的:查找并修复你的数据引用;一切都应该是不变的。如果你需要混淆数据,首先将它复制到调用者提供的缓冲区,或类似的东西。

如果您可以花一些时间学习GCC属性扩展,您会发现几个增强GCC对代码理解的属性,从而实现更好的优化(例如pureconst函数)。这可以减少很多字节。

更重要的是,试着让GCC提供关于如何使用代码的基本提示,例如,适当时使用static函数。

GCC仍然会添加一些虚拟部分,您可以使用strip实用程序来消除这些部分。它不会在默认情况下删除所有内容,您需要指定-s标志来删除所有符号,并且-R name可以删除一个节。你可以用objcopy -S -R name ...做一些类似的事情(只是提到它,因为如果你打算做一些其他的事情,你可以一次完成)。