我想使用GNU LD版本脚本来隐藏c ++共享库中不需要的符号。假设我的头文件如下所示:
int a();
int a(int);
class B {
B(){}
~B(){}
int x(int);
};
std::ostream& operator<< (std::ostream& out, const B& b );
我想隐藏未在头文件中声明的所有内容。
这个版本脚本怎么样?
答案 0 :(得分:3)
这样的事情可以解决问题:
{
global:
extern "C++" {
"a()";
"a(int)";
B::*;
"operator<<(std::ostream&, B const&)";
};
local:
*;
};
如果您将此文件另存为foo.map
,请将-Wl,--version-script,foo.map
作为参数传递给链接器。快速概述语法:
由于我们没有在脚本的顶层指定版本标签,因此库中的符号不会附加版本:脚本的效果只是选择哪些符号可见。< / p>
global
部分匹配的所有内容都将显示,而剩余的与local
部分匹配的内容(在本例中为glob *
)将被隐藏。< / p>
extern "C++" { ... };
块表示链接器应根据C ++ ABI对符号进行解码,然后再尝试匹配所包含的模式。
引号中的模式直接匹配,而未引用的模式则视为glob模式。
可以在此处找到版本脚本文件格式的更多详细信息:https://sourceware.org/binutils/docs/ld/VERSION.html