我试图在我的代码中删除未使用的函数(没有对它们进行调用),该代码使用gcc/g++构建在x86/Linux上。当我从gcc手册中阅读时,我使用以下选项:
CCFLAGS = -ffunction-sections -fdata-sections -Wl,--gc-sections,--print-gc-sections
使命令输出显示一些未使用的部分删除消息,如下所示:
/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选项是否真的删除了未使用的函数:
您正在查看.o
文件,但这是链接器的输入,而不是输出。.o
文件将包含所有函数,链接器不应将未使用的函数发送到链接的输出中。它不编辑.o
文件,但