gcc的奇怪行为,以及用于删除未使用函数的ld(链接器)选项

时间:2013-01-07 18:15:11

标签: function gcc ld dead-code

我试图在使用gcc / g ++在x86 / Linux上构建的代码中删除未使用的函数(没有对它们进行调用)。 我从gcc手册中读到了以下选项:

CCFLAGS = -ffunction-sections -fdata-sections -Wl,--gc-sections,--print-gc-sections

make命令输出确实显示了一些未使用的部分已删除的消息,如下所示:

/usr/bin/ld: Removing unused section '.text._ZN14myclass30myunusedfuncEPPNS_8device_sE' in file './myproject/x86-linux/release/file1.o'

但是为了确保,我试图找出* .o对象文件中是否存在该符号, 所以当我这样做时:

strings --all -f file1.o|grep myunusedfunc

我看到输出如下

myproject/x86-linux/debug/file1.o: [] myclass::myunusedfunc()
myproject/x86-linux/debug/file1.o: myunusedfunc
myproject/x86-linux/debug/file1.o: _ZN14myclass30myunusedfuncEPPNS_8device_sE
myproject/x86-linux/debug/file1.o: .rel.text._ZN14myclass30myunusedfuncEPPNS_8device_sE
myproject/x86-linux/debug/file1.o: _ZN14myclass30myunusedfuncEPPNS_8device_sE

发生了什么事?

这些gcc / ld选项确实删除了未使用的函数:

1 个答案:

答案 0 :(得分:1)

您正在查看.o文件,但这是链接器的输入,而不是输出。 .o文件将包含所有函数,链接器不应将未使用的函数发送到链接的输出中。它不会编辑.o文件。