丢弃 GCC 中未使用的函数

discard unused functions in GCC

我需要一些帮助在 MinGW 下使用 GCC 进行编译。

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

然后我link将这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 中保存一些 space?

谢谢

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

 -ffunction-sections -fdata-sections

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

--gc-sections

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

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