2013年10月24日 星期四

gcc 控制符號的可見性

在某些情況下我們會想要把一些函數或變數隱藏起來,不要讓它們出現在 symbol table 裡。


static

將全域變數或函數宣告成 local,只有該 object file 內的 function 看得到它。有 static 的話會無視 visibility 屬性宣告。


__attribute__((visibility ("hidden")))

全域變數或函數宣告預設是宣告成 global,加上 visibility 屬性後可見性設定為隱藏。編譯期間會標示成 global,但名稱會變成 .hidden function。最後連結產生 shared object 的時候該 symbol 不會出現在 dynamic symbol table,但是會在 symbol table 中出現且標示為 local。如果要做到完全隱藏,產生 shared object 以後要 strip 拔掉 symbol table。


-fvisibility=hidden

同 __attribute__((visibility ("hidden"))),不過這是從編譯器的命令列參數,等於是設定預設的 visibility。