在MinGW中建立最小DLL?

kil*_*ode 5 c dll mingw

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

  1. “ -Wl,-exclude-all-symbols”删除所有符号,但是将exports目录保留在那里,占用大量空间
  2. 如果我使用ld脚本将.data和.text部分绑定在一起,那会使.reloc部分无用吗?据我所知.reloc用于从.text到.data的绝对地址,如果它们都在同一节中,则所有地址都是相对的吗?

谢谢。

Ism*_*eno 4

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

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

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

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

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