我的程序包含许多外部定义的变量。当我使用-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):
<my_symbol absent>
答案 0 :(得分:2)
如果您的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;
}
即使您使用foo.o
或-O1
进行编译,所有这些符号也会存在于-O2
中。
答案 1 :(得分:1)
使用`-O1'和'-O2',编译器会尝试减少代码大小和执行时间。用于减少生成的可执行文件大小的优化之一是“抛出所有内容”,这不是执行所必需的。可执行文件的符号表是执行中不需要的调试细节之一;所以它被排除在最终输出文件之外。
(' - O0'表示“不做优化”)。