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

时间:2011-12-08 14:21:23

标签: c++ compilation linker

我想使用GNU LD版本脚本来隐藏c ++共享库中不需要的符号。假设我的头文件如下所示:

int a();
int a(int);

class B {
    B(){}
    ~B(){}
    int x(int);
};

std::ostream& operator<< (std::ostream& out, const B& b );

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

这个版本脚本怎么样?

1 个答案:

答案 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

相关问题