即时尝试编译一个尽可能小的dll,我减少了部分alignmnent,它节省了一些大小,并且我还用(-nostdlib)和所有优化删除了stdlib。现在我有一些问题在MinGW中构建最小DLL?
- “轮候册,-exclude-所有符号”删除所有符号,但保留出口目录下有服用大量的空间
- ,如果我使用LD-脚本绑定两个.data和.text部分放在一起,是否会使.reloc部分无用?据我所知.reloc用于从.text到.data的绝对地址,如果它们都在同一节中,所有的地址都是相对的?
谢谢。
即时尝试编译一个尽可能小的dll,我减少了部分alignmnent,它节省了一些大小,并且我还用(-nostdlib)和所有优化删除了stdlib。现在我有一些问题在MinGW中构建最小DLL?
谢谢。
不要乱用部分,只需使用-fPIC
标志来减少重定位(否则引用在x86上始终是绝对的)。您仍然会有一个.reloc
,因为它用于链接。此外,请始终使用-Os
和进行编译。
顺便说一句,你不应该有一个.data
部分。如果你这样做是因为某些事情是错误的:查找并修复你的数据引用;一切都应该是不变的。如果你需要混淆数据,首先将它复制到调用者提供的缓冲区,或类似的东西。
如果您可以花一些时间学习GCC属性扩展,您会发现几个增强GCC对代码理解的属性,从而实现更好的优化(例如pure
和const
函数)。这可以减少很多字节。
更重要的是,试着让GCC提供关于如何使用代码的基本提示,例如,适当时使用static
函数。
GCC仍然会添加一些虚拟部分,您可以使用strip
实用程序来消除这些部分。它不会在默认情况下删除所有内容,您需要指定-s
标志来删除所有符号,并且-R name
可以删除一个节。你可以用objcopy -S -R name ...
做一些类似的事情(只是提到它,因为如果你打算做一些其他的事情,你可以一次完成)。