有没有一种方法可以从我未使用的目标文件中剥离所有函数?

4

我试图在我的可执行文件中节省空间,发现有几个函数被添加到我的目标文件中,即使我从未调用它们(这些代码来自库)。

有没有办法告诉gcc自动删除这些函数,还是我需要手动删除它们?

5个回答

2
如果你正在编译目标文件(而不是可执行文件),那么编译器将永远不会删除任何非static函数,因为你可能会将目标文件与调用该函数的另一个目标文件链接。因此,你的第一步应该是尽可能地声明许多函数为static
其次,编译器删除任何未使用的函数的唯一方法是静态链接可执行文件。在这种情况下,至少有可能会出现一个程序并找出哪些函数被使用,哪些函数没有被使用。
问题是,我不认为gcc实际上会进行这种跨模块优化。你最好的选择是使用-Os标志来优化代码大小,但即使如此,如果你有一个目标文件abc.o,其中有一些未使用的非静态函数,并且你静态链接到某个可执行文件def.exe中,我认为gcc也不会去除未使用函数的代码。
如果你真的非常需要这样做,我认为你可能必须将文件实际上#include在一起,以便在预处理器通过后,它会导致单个.c文件被编译。通过gcc编译单个庞大的巨型源文件,你有最好的机会消除未使用的函数。

1

你有没有尝试使用 -Os 调用 gcc(优化大小)?我不确定它是否会剥离未被调用的代码,但测试起来很简单。在获取可执行文件后,你还可以使用 'strip' 命令进行剥离。我相信 gcc 也有一个命令行参数可以实现同样的功能——是 --dead_strip 吗?


1
除了使用-Os进行大小优化外,this链接可能会有所帮助。

1

自从我提出这个问题以来,GCC 4.5已经发布了,其中包括一个选项,可以将所有文件合并在一起,因此看起来就像是一个庞大的源文件。使用该选项,可以轻松地剥离未使用的函数。

更多详情在这里


0

如果我没记错的话,默认情况下链接器在某些特定情况下会按照你想要的方式进行操作。简而言之,库文件包含一堆目标文件,只有被引用的文件才会被链接。如果你能够找出如何让GCC将每个函数都编译成自己的目标文件,然后将其构建成一个库,那么你应该就能得到你想要的结果。

我只知道有一种编译器可以实现这个功能:here(看一下-lib标志)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接