【问题标题】:Is there a way to strip all functions from an object file that I am not using?有没有办法从我不使用的目标文件中删除所有函数?
【发布时间】:2010-04-13 23:56:01
【问题描述】:

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

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

【问题讨论】:

    标签: gcc compiler-construction space


    【解决方案1】:

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

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

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

    如果您真的非常需要这样做,我认为您可能必须将文件实际#include 放在一起,以便在预处理器通过后,它会导致编译单个 .c 文件。使用 gcc 编译单个巨大的源文件,您最有可能消除未使用的函数。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          更多详情here

          【讨论】:

            【解决方案5】:

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

            我只知道一种编译器实际上可以做到这一点:here(查看 -lib 标志)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-02-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多