Скрипт LD для скрытия символов в c ++ - PullRequest
5 голосов
/ 08 декабря 2011

Я бы хотел использовать скрипт версии 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 Ответ

4 голосов
/ 18 февраля 2014

Примерно так должно получиться:

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

Если вы сохранили этот файл как foo.map, передайте компоновщику -Wl,--version-script,foo.map в качестве аргумента. Краткое изложение синтаксиса:

  • Поскольку мы не указали метку версии на верхнем уровне скрипта, к символам в библиотеке не будут прикреплены версии: эффект скрипта состоит в том, чтобы просто выбрать, какие символы видны.

  • Все, что соответствует разделу global, будет видимым, а все остальное, что соответствует разделу local (в данном случае глобус *), будет скрыто.

  • Блок extern "C++" { ... }; говорит, что компоновщик должен разобрать символы в соответствии с ABI C ++, прежде чем пытаться сопоставить с вложенными шаблонами.

  • Шаблоны в кавычках сопоставляются напрямую, а шаблоны без кавычек обрабатываются как глобальные шаблоны.

Более подробную информацию о формате файла версии скрипта можно найти здесь: https://sourceware.org/binutils/docs/ld/VERSION.html

...