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

时间:2014-05-15 01:03:21

标签: c 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):
    <my_symbol absent>

2 个答案:

答案 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'表示“不做优化”)。