在MinGW中构建最小DLL?

时间:2011-12-15 16:44:25

标签: c dll mingw

我试图尽可能小地编译一个dll,我减少了section alignmnent并保存了一些大小,我还删除了带有(-nostdlib)和所有Optimizations的stdlib。现在我有一些问题

  1. “ -​​ Wl,-exclude-all-symbols”删除所有符号,但导出目录会占用大量空间
  2. 如果我使用ld脚本将.data和.text段绑定在一起,是否会使.reloc部分无用?据我所知.reloc用于从.text到.data的绝对地址,如果它们都在同一部分,那么所有地址都是相对的吗?
  3. 感谢。

1 个答案:

答案 0 :(得分:3)

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

顺便说一下,你不应该有.data部分。如果你这样做是因为出了点问题:寻找并修复你的数据引用;一切都应该是不变的。如果你需要弄乱数据,首先将它复制到调用者提供的缓冲区,或类似的东西。

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

更重要的是,尝试向GCC提供有关您如何使用代码的基本提示,例如:在适当的时候使用static函数。

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