如何让gcc忽略函数永远不会被调用?

时间:2011-09-16 12:05:39

标签: c gcc

#include <stdio.h>

void func(){
  printf("123\n");
}

int main(){
  printf("hi\n");
}

似乎无论我如何编译它,func总是存在于二进制目标中?

7 个答案:

答案 0 :(得分:6)

默认情况下,函数在C中具有extern链接。使static通知链接器在外部不需要它,它应该将其保留。

答案 1 :(得分:2)

你已经尝试过-fwhole-program? (编译器在链接他之后真正使用的函数之前不知道,这告诉他,没有别的东西,-lto(和相关的)也可以工作)

答案 2 :(得分:2)

func()必须保留在源文件生成的目标代码中,因为它具有外部链接,因此可以从您选择链接的另一个目标文件中使用它。

例如,一个包含:

int x = (func(), 0);

当您执行最终链接时,链接器可能会检测到该函数实际上未被使用。如果函数具有内部链接(例如,如果添加了static存储类说明符),则编译器可能会检测到该函数未被使用,并且省略为其生成任何对象代码。

最简单的“修复”只是从源文件中删除func的定义。

答案 3 :(得分:1)

具体答案: Solaris 10,RHEL 4上的结果:

gcc -funit-at-a-time  file.c  -o 
带有“static”声明的func的

产生(编辑的,Solaris示例)的nm输出:

[39]    |    133316|       0|OBJT |LOCL |0    |16     |force_to_data
[37]    |     67064|       0|FUNC |LOCL |0    |9      |frame_dummy
[78]    |     67208|      36|FUNC |GLOB |0    |9      |main
[44]    |    133360|      24|OBJT |LOCL |0    |22     |object.2

gcc file.c -o file产生:

[39]    |    133356|       0|OBJT |LOCL |0    |16     |force_to_data
[37]    |     67064|       0|FUNC |LOCL |0    |9      |frame_dummy
[49]    |     67208|      32|FUNC |LOCL |0    |9      |func
[79]    |     67240|      36|FUNC |GLOB |0    |9      |main
[44]    |    133400|      24|OBJT |LOCL |0    |22     |object.2
[46]    |    133392|       0|OBJT |LOCL |0    |21     |p.0

因为gcc -O2一次开启-funit:

[54]    |    133308|       0|OBJT |LOCL |0    |16     |force_to_data
[37]    |     67064|       0|FUNC |LOCL |0    |9      |frame_dummy
[78]    |     67208|      24|FUNC |GLOB |0    |9      |main
[44]    |    133344|      24|OBJT |LOCL |0    |22     |object.2

因为-O2有其他副作用,比如使调试器使用不太可靠, 考虑使用

gcc -funit-at-a-time file.c -o file

答案 4 :(得分:0)

这是一个名为dead code elimination的常见优化,因此GCC可能会在低优化级别执行它。

答案 5 :(得分:0)

尝试使用-ffunction-sections -fdata-sections进行编译。这些选项有助于减少可执行文件的大小。 Reducing Executable Size

答案 6 :(得分:0)

如果要在某些条件下包含/排除某些函数,可以使用预处理程序指令:

#if defined(MYCONDITION)
void func(){
  printf("123\n");
}
#endif