使用优化时,gcc不包括符号表中的外部变量

我的程序包含许多外部定义的变量。 当我用-O0标志编译它时,我在符号表中看到它们,但是当我使用-O1或-O2时却看不到它们。 如何强制编译器导出它们?

foo.c: extern const int my_symbol; void my_fn() { void *x = &my_symbol; // but x is not used, that's probably why it is optimised out } nm foo.o (with O0): U my_symbol nm foo.o (with O2):  

如果你的foo.c只(基本上)有

 extern const int my_symbol; 

然后用-O1-O2编译它,该符号将被优化掉。 但是,例如,如果在foo.c使用该符号

 extern const int my_symbol; extern int my_flag; void foo(void) { if (my_symbol) my_flag = 1; } 

即使用-O1-O2编译它们,所有这些符号也将存在于foo.o

使用`-O1’和’-O2’,编译器会尝试减少代码大小和执行时间。 用于减少生成的可执行文件大小的优化之一是“抛出所有内容”,这不是执行所必需的。 可执行文件的符号表是执行中不需要的调试细节之一; 所以它被排除在最终输出文件之外。

(’-O0’表示“不做优化”)。