有没有办法从我不使用的目标文件中删除所有函数?

时间:2010-04-13 23:56:01

标签: gcc compiler-construction space

我正在尝试在我的可执行文件中节省空间,我注意到我的目标文件中添加了几个函数,即使我从不调用它们(代码来自库)。

有没有办法让gcc自动删除这些功能,还是需要手动删除它们?

5 个答案:

答案 0 :(得分:2)

如果要编译成目标文件(不是可执行文件),那么编译器永远不会删除任何非static函数,因为您始终可以将目标文件链接到将调用该函数的另一个目标文件。因此,您的第一步应该是声明尽可能多的函数static

其次,编译器删除任何未使用的函数的唯一方法是静态链接您的可执行文件。在这种情况下,至少有可能出现一个程序并找出使用了哪些函数以及哪些函数未被使用。

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

如果你真的迫切需要这样做,我想你可能必须实际上#include这些文件在一起,这样在预处理器传递之后,它会导致编译一个.c文件。使用gcc编译一个怪异的jumbo源文件,你就有机会消除未使用的函数。

答案 1 :(得分:1)

您是否考虑过使用-Os调用gcc(针对大小进行优化)。我不确定它是否会删除未到达的代码,但是它很容易测试。在获得可执行文件后,您还可以“剥离”它。我确定有一个gcc命令行arg做同样的事情 - 是--dead_strip吗?

答案 2 :(得分:1)

-Os优化尺寸外,this链接可能会有所帮助。

答案 3 :(得分:1)

自从我提出这个问题以来,GCC 4.5已经发布了,它包含了一个组合所有文件的选项,所以看起来它只是一个巨大的源文件。使用该选项,可以轻松地去除未使用的功能。

更多详情here

答案 4 :(得分:0)

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

我只知道一个可以实际执行此操作的编译器:here(查看-lib标志)

相关问题