2010-03-03 72 views
6

我發現,當我將可執行文件與靜態庫(.a)鏈接時,靜態庫中的符號最終被可執行文件導出。我想避免這種情況並且不輸出任何內容。避免從Linux上的可執行文件導出符號

我試過提供一個版本腳本,但它似乎沒有區別。是我的版本腳本的內容如下:

{ 
    global: 
     main; 
    local: 
     *; 
}; 

是否有靜態庫鏈接時不從可執行導出符號的方法嗎?我無法重新編譯靜態庫本身。

回答

7

可執行文件默認不出口的符號,並不會這麼做,除非你使用-Wl, - 出口動態。這隻有在動態加載自己需要鏈接到主要可執行文件中的符號的庫時纔是必需的(如果您的庫包含的類會覆蓋exe文件中的虛擬方法,這在C++中是常見的情況)

也許,重新輸出具有調試符號的符號。調試符號將生成調試器(如果您不去除exe),但不需要運行。

+1

似乎gcc 4.8.2(在arch linux上)默認情況下會導出exec函數名,如果使用-fvisibility = hidden,則會導致事件。只有向鏈接器添加-s才能刪除符號。 – aisbaa 2013-12-20 14:28:24

3

使用strip

$ man strip

+0

Strip不會停止可執行導出符號,因爲它只關閉調試信息。 – MarkR 2010-03-03 22:36:49

+1

@MarkR:閱讀帶的手冊頁 - 它可以刪除很多不僅僅是調試符號 – 2010-03-03 23:37:57

+0

但是,如果你刪除所需的部分運行,那麼二進制文件將不會再運行,顯然:) – MarkR 2010-03-04 09:53:34

相關問題