2014-05-15 30 views
0

我的程序包含許多外部定義的變量。當我使用-O0標誌進行編譯時,我在符號表中看到它們,但在使用-O1或-O2時看不到它們。我如何強制編譯器導出它們?當使用優化時,gcc在符號表中不包含extern變量

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

你真的在你的'foo.c'中使用'my_symbol'嗎? –

+0

症狀表明該變量已被優化。嘗試使用它,做一些無法優化的東西。例如,'printf'它的值,並沒有在這個文件中定義它的值。 –

+0

@ user3638885如果你沒有在你的'foo.c'中使用它,爲什麼你首先在源文件中聲明它? –

回答

1

使用'-O1'和'-O2',編譯器會嘗試減少代碼大小和執行時間。用於減小結果可執行文件大小的優化之一是「拋出所有不需要執行的內容」。可執行文件的符號表是其中一種調試細節,它並不是執行所必需的;所以它被排除在最終的輸出文件之外。

('-O0'表示「不做優化」)。

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編譯。