丢弃GCC中未使用的功能

时间:2016-03-16 10:55:33

标签: gcc ld

我需要一些帮助,以便在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: *;
} 

用于控制要导出的函数。

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

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

由于

1 个答案:

答案 0 :(得分:3)

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

 -ffunction-sections -fdata-sections

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

--gc-sections

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

另请参阅此问题:Query on -ffunction-section & -fdata-sections options of gcc了解详情。