问题描述
我想使用GNU LD版本脚本来隐藏c ++共享库中不需要的符号.说我的头文件看起来像这样:
I would like to use an GNU LD version script to hide unwanted symbols in c++ shared library. Say my header file looks like this:
int a();
int a(int);
class B {
B(){}
~B(){}
int x(int);
};
std::ostream& operator<< (std::ostream& out, const B& b );
我想隐藏头文件中未说明的所有内容.
I would like to hide everything which is not stated in the header file.
此版本脚本的外观如何?
How would a version script for this look like?
推荐答案
这种方法应该可以解决问题:
Something like this should do the trick:
{
global:
extern "C++" {
"a()";
"a(int)";
B::*;
"operator<<(std::ostream&, B const&)";
};
local:
*;
};
如果将此文件另存为foo.map
,请将-Wl,--version-script,foo.map
作为参数传递给链接器.语法的简要介绍:
If you saved this file as foo.map
, pass -Wl,--version-script,foo.map
as an argument to the linker. A quick rundown of the syntax:
-
由于我们没有在脚本的顶层指定版本标签,因此库中的符号将不会附加版本:脚本的作用只是选择可见的符号.
Since we didn't specify a version label at the top level of the script, the symbols in the library won't have versions attached: the effect of the script is simply to pick which symbols are visible.
与global
部分匹配的所有内容都是可见的,而与local
部分匹配的其余所有内容(在本例中为glob *
)都将被隐藏.
Everything matched by the global
section will be visible, while everything remaining that matches the local
section (in this case, the glob *
) will be hidden.
extern "C++" { ... };
块表示,链接器应在尝试与包含的模式匹配之前,根据C ++ ABI对符号进行脱粒.
The extern "C++" { ... };
block says the linker should demangle symbols according to the C++ ABI before trying to match against the enclosed patterns.
引号中的模式直接匹配,而未引号中的模式被视为全局模式.
Patterns in quotes are matched directly, while unquoted patterns are treated as glob patterns.
可以在此处找到版本脚本文件格式的更多详细信息: https://sourceware .org/binutils/docs/ld/VERSION.html
More details of the version script file format can be found here: https://sourceware.org/binutils/docs/ld/VERSION.html
这篇关于用于C ++中符号隐藏的LD脚本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!