我想节省空间,在我的可执行文件,我注意到,有几个功能被添加到我的目标文件,即使我从来没有叫他们(代码是从库)。

有没有办法告诉GCC来自动删除这些功能还是需要手动删除它们?

有帮助吗?

解决方案 4

由于我问这个问题,GCC 4.5发布,其中包括一个选项,所有文件,所以它看起来像它只是1巨大的源文件结合起来。使用该选项,则能够容易地剥离出未使用的功能。

的更多细节这里

其他提示

如果您正在编译成目标文件(而非可执行文件),则编译器不会删除任何非static功能,因为它总是可能的,你会在目标文件链接在其他物体上的文件,将调用该函数。因此,第一个步骤应该是声明尽可能多的功能尽可能static

其次,编译器将删除任何未使用的功能的唯一方法是静态链接可执行文件。在这种情况下,至少有这种可能性,即程序可能出现沿,弄清所使用的功能,哪些不使用。

美中不足的是,我不相信,海湾合作委员会实际上做这种类型的跨模块优化。最好的办法是-Os标志,以优化代码大小,但即使是这样,如果你有一个目标文件abc.o其中有一些未使用的非静态函数,你静态链接对一些可执行def.exe,我不相信该GCC将去剥离出的代码未使用的功能。

如果你真的迫切需要这样做,我想你可能有实际的文件#include在一起,使得预处理通,会导致一个.c文件后进行编译。用gcc编译一个可怕的巨型源文件,你站在未使用的函数的最佳机会被淘汰。

你有没有看着调用GCC与OS(优化的大小。)我不知道,如果它去除未得代码,但它是足够简单测试。你也可以,让你的可执行回来,“条”之后。我敢肯定有一个gcc命令行参数做同样的事情 - 是--dead_strip

在除了-Os以优化尺寸,链路可能有帮助。

IIRC默认链接你想要做什么插件一些特殊情况。它的短是该库文件包含了一堆目标文件,只引用文件链接的,如果你能弄清楚如何让GCC各功能发射到它自己的目标文件,然后构建成你应该得到一个图书馆这你在找什么。

我只知道一个编译器,它可以真正做到这一点的:这里(看-lib标志)

scroll top