【问题标题】:discard unused functions in GCC [duplicate]丢弃GCC中未使用的函数[重复]
【发布时间】:2016-07-02 05:02:22
【问题描述】:

我需要一些关于在 MinGW 下使用 GCC 编译的帮助。

假设我有 2 个文件: a.c 包含 2 个函数 a1 和 a2 b.c 包含 2 个函数 b1 和 b2。

然后我将这 2 个对象链接到一个共享库中。使用的命令如下:

gcc -c a.c
gcc -c b.c
gcc -shared -Wl, --version-script v.ver -Wl, -Map=out.map -Wl, --strip-all -o mydll.dll a.o b.o

v.ver 看起来像:

mylib {
   global: a1;
           a2;
   local: *;
} 

用于控制导出哪些函数。

通过检查映射文件,我可以看到 b.c 中的 2 个函数也包含在 dll 的 .text 部分中。

因为这个 dll 只导出 a1 和 a2,而 b1 和 b2 只在 b.c 中定义,但从未在任何地方使用。我可以在 gcc 或 ld 中添加任何选项,以便 b1 和 b2 不会内置到 dll 中,以便我可以在 dll 中节省一些空间?

谢谢

【问题讨论】:

    标签: gcc ld


    【解决方案1】:

    是的,这是可能的。为此,在将 C 源代码编译为对象时添加以下两个标志:

     -ffunction-sections -fdata-sections
    

    这将生成更大的目标文件,但会为链接器添加大量信息。调用链接器时添加以下标志:

    --gc-sections
    

    链接器现在将丢弃所有未使用的函数和部分。

    另请参阅此问题:Query on -ffunction-section & -fdata-sections options of gcc 了解更多信息。

    【讨论】:

    • 感谢 Cheiron,实际上我在 Unbutu 机器上尝试了这些选项很长时间,并且成功了。我记得看到有人说这些选项仅适用于 ELF (linux) 可执行文件。明天我会在 MinGW 上尝试一下,但是有没有人可以选择实现相同的目标?
    • 这些是 GCC 标志,因此可以在任何平台上工作,针对任何东西,只要它不是静态库。好吧,当考虑更长时间时:您如何确定这些功能永远不会被使用?我可以编写一个链接到您的 DLL 并调用您想要删除的函数的程序,对吗?那么从这个意义上说,为什么要删除这些功能呢?
    • 等等,没关系:我监督了地图部分。好吧,如果那部分工作正常,那么链接器没有理由不删除未使用的函数,所以它应该可以工作。
    • 不适用于 Android 工具链生成的 .so 文件。这些选项已经存在于工具链文件中。当我对为 ARMEABI 生成的 .so 执行 readelf -a 命令时,它还显示了所有未使用的函数的名称。
    • 如果它确实适用于 .so 文件会很奇怪,因为它是一个库,因此其他程序可以调用该库中未被库中另一个函数调用的函数。
    猜你喜欢
    • 2016-05-18
    • 2017-05-19
    • 2013-09-01
    • 2019-03-16
    • 1970-01-01
    • 2018-09-20
    • 2020-04-20
    • 1970-01-01
    • 2017-12-02
    相关资源
    最近更新 更多