#include <stdio.h>
void func(){
printf("123\n");
}
int main(){
printf("hi\n");
}
似乎无论我如何编译它,func
总是存在于二进制目标中?
答案 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