2011-12-08 50 views
3

我想使用GNU LD版本腳本來在C++共享庫中隱藏不需要的符號。說我的頭文件看起來像這樣:用於在C++中進行符號隱藏的LD腳本

int a(); 
int a(int); 

class B { 
    B(){} 
    ~B(){} 
    int x(int); 
}; 

std::ostream& operator<< (std::ostream& out, const B& b); 

我想隱藏未在頭文件中規定的一切。

這個樣子的版本腳本怎麼樣?

回答

1

像這樣的東西應該做的伎倆:

{ 
global: 
    extern "C++" { 
     "a()"; 
     "a(int)"; 
     B::*; 
     "operator<<(std::ostream&, B const&)"; 
    }; 
local: 
    *; 
}; 

如果你將該文件保存爲foo.map,通過​​作爲參數傳遞給連接器。語法的簡要介紹:

  • 由於我們沒有在腳本的頂層指定版本標籤,在庫中的符號將沒有連接的版本:腳本的效果簡直選擇哪些符號可見。

  • 一切由global部分匹配的將是可見的,而其餘的一切相匹配的local部分(在這種情況下,水珠*)將被隱藏。

  • extern "C++" { ... };塊表示鏈接器應該在根據C++ ABI去匹配符號,然後嘗試匹配封閉的模式。

  • 引號中的模式直接匹配,而未引用的模式被視爲glob模式。

版本腳本文件格式的詳細信息可以在這裏找到:https://sourceware.org/binutils/docs/ld/VERSION.html