我试图在我的可执行文件中节省空间,我注意到几个函数被添加到我的目标文件中,即使我从未调用它们(代码来自库)。
有没有办法告诉 gcc 自动删除这些功能,还是我需要手动删除它们?
我试图在我的可执行文件中节省空间,我注意到几个函数被添加到我的目标文件中,即使我从未调用它们(代码来自库)。
有没有办法告诉 gcc 自动删除这些功能,还是我需要手动删除它们?
如果您正在编译成目标文件(不是可执行文件),那么编译器将永远不会删除任何非static
函数,因为您总是有可能将目标文件链接到另一个将调用该函数的目标文件。所以你的第一步应该是声明尽可能多的函数static
。
其次,编译器删除任何未使用函数的唯一方法是静态链接您的可执行文件。在这种情况下,至少有可能出现一个程序并找出哪些函数被使用,哪些函数未被使用。
问题是,我不相信 gcc 实际上会进行这种类型的跨模块优化。你最好的选择是-Os
优化代码大小的标志,但即便如此,如果你有一个目标文件 abc.o,它有一些未使用的非静态函数,并且你静态链接到一些可执行的 def.exe,我不相信gcc 将删除未使用函数的代码。
如果您真的非常需要这样做,我认为您可能必须#include
将文件实际放在一起,以便在预处理器通过后,它会导致编译单个 .c 文件。使用 gcc 编译单个巨大的巨型源文件,您最有可能消除未使用的函数。
您是否考虑过使用 -Os 调用 gcc(针对大小进行优化)。我不确定它是否会去除未到达的代码,但它足够简单以进行测试。在取回可执行文件后,您还可以“剥离”它。我确定有一个 gcc 命令行 arg 可以做同样的事情 - 是 --dead_strip 吗?
除了-Os
优化大小之外,此链接可能会有所帮助。
自从我问了这个问题后,GCC 4.5 就发布了,其中包含一个合并所有文件的选项,所以看起来它只是一个巨大的源文件。使用该选项,可以轻松去除未使用的功能。
更多细节在这里
IIRC 默认情况下,链接器会在某些特定情况下执行您想要的操作。简而言之,库文件包含一堆目标文件,并且只有引用的文件被链接。如果你能弄清楚如何让 GCC 将每个函数发出到它自己的目标文件中,然后将它构建到一个库中,你应该得到你在看什么。
我只知道一个可以真正做到这一点的编译器:here(查看 -lib 标志)