All*_*lan 5 c++ linker compilation
我想使用GNU LD版本脚本来隐藏c ++共享库中不需要的符号。说我的头文件看起来像这样:
int a();
int a(int);
class B {
B(){}
~B(){}
int x(int);
};
std::ostream& operator<< (std::ostream& out, const B& b );
Run Code Online (Sandbox Code Playgroud)
我想隐藏所有未在头文件中说明的内容。
版本脚本的外观如何?
像这样的事情应该可以解决问题:
{
global:
extern "C++" {
"a()";
"a(int)";
B::*;
"operator<<(std::ostream&, B const&)";
};
local:
*;
};
Run Code Online (Sandbox Code Playgroud)
如果将此文件另存为foo.map,-Wl,--version-script,foo.map请将其作为参数传递给链接器。语法的简要概述:
由于我们没有在脚本的顶层指定版本标签,库中的符号不会附加版本:脚本的作用只是选择哪些符号是可见的。
与该global部分匹配的所有内容都将可见,而与该local部分匹配的所有剩余内容(在本例中为 glob *)将被隐藏。
该extern "C++" { ... };块表示链接器应该在尝试匹配封闭的模式之前根据 C++ ABI 对符号进行解构。
引号中的模式直接匹配,而未引用的模式被视为全局模式。
可以在此处找到版本脚本文件格式的更多详细信息:https : //sourceware.org/binutils/docs/ld/VERSION.html
| 归档时间: |
|
| 查看次数: |
1579 次 |
| 最近记录: |