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

LD script for symbol hidding in c++

本文关键字:LD 脚本 符号 隐藏 c++ 用于      更新时间:2023-10-16

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

int a();
int a(int);
class B {
    B(){}
    ~B(){}
    int x(int);
};
std::ostream& operator<< (std::ostream& out, const B& b );

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

这个版本脚本看起来像什么?

类似这样的代码应该可以达到这个效果:

{
global:
    extern "C++" {
        "a()";
        "a(int)";
        B::*;
        "operator<<(std::ostream&, B const&)";
    };
local:
    *;
};

如果您将此文件保存为foo.map,则将-Wl,--version-script,foo.map作为参数传递给链接器。语法的快速概要:

  • 由于我们没有在脚本的顶层指定版本标签,库中的符号不会附加版本:脚本的效果只是选择哪些符号是可见的。

  • global部分匹配的所有内容将可见,而与local部分匹配的所有内容(在本例中,glob *)将被隐藏。

  • extern "C++" { ... };块表示链接器在尝试匹配所包含的模式之前应该根据c++ ABI要求符号。

  • 带引号的模式直接匹配,未加引号的模式作为全局模式处理。

更多版本脚本文件格式的详细信息可以在这里找到:https://sourceware.org/binutils/docs/ld/VERSION.html