2010-04-13 95 views

回答

1

因为我问这个问题,GCC 4.5发布,其中包括一个选项,所有的文件,所以它看起来结合就像它只是一个巨大的源文件。使用该选项,可以轻松去除未使用的功能。

更多详细信息here

1

你有没有看过使用-Os调用gcc(优化大小)。我不确定它是否剥离了未经验证的代码,但它足够简单,可以进行测试。在取回可执行文件之后,您也可以“去掉”它。我确定有一个gcc命令行arg来做同样的事情 - 它是--dead_strip?

1

除了-Os来优化大小,this链接可能会有所帮助。

2

如果您正在编译目标文件(不是可执行文件),那么编译器将永远不会删除任何非static函数,因为总是有可能将目标文件与另一个将调用该函数的目标文件链接起来。所以你的第一步应该尽可能多的声明static。其次,编译器删除任何未使用的函数的唯一方法是静态链接您的可执行文件。在这种情况下,至少有一种可能性,程序可能会出现并找出哪些功能被使用,哪些不被使用。

问题是,我不相信gcc实际上会做这种跨模块优化。你最好的选择是-Os标志来优化代码大小,但即使如此,如果你有一个目标文件abc.o,它有一些未使用的非静态函数,并且静态链接到一些可执行文件def.exe,我不相信gcc会去掉未使用函数的代码。

如果你真的非常需要这样做,我想你可能不得不将#include这些文件放在一起,以便在预处理器通过后,它会生成一个正在编译的.c文件。使用gcc编译一个巨大的巨型源文件,您可以消除未使用函数的最佳机会。

0

IIRC链接器默认情况下做你想要的东西在一些特定情况下。它的缺点是库文件包含一堆目标文件,只有被引用的文件被链接进来。如果你能弄清楚如何让GCC将每个函数发送到它自己的目标文件中,然后将它建立到一个库中,你应该得到你在看什么。

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

相关问题