用于C ++中符号隐藏的LD脚本

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)

我想隐藏所有未在头文件中说明的内容。

版本脚本的外观如何?

Jam*_*dge 8

像这样的事情应该可以解决问题:

{
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