2011-12-08 27 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