версия-скрипт и скрытая видимость

При использовании gcc для создания общей библиотеки можно ограничить видимость символов с помощью -fvisibility=hidden. Я также только что узнал, что вы можете ограничить видимость, используя опцию сценария версии до ld.

Теперь я хочу знать, возможно ли их совместить. Скажем, у меня есть программа со следующим:

void foobar() {}
void say_hello() {}

Затем у меня есть файл сценария версии с:

{
  global:
    foobar;
}

И я компилирую это с помощью:

gcc -fvisibility=hidden -Wl,--version-script=<version-script> test.c -shared -o libtest.so

Когда я потом запускаю nm, я обнаруживаю, что никакие символы не экспортируются. В любом случае, я могу установить скрытую видимость по умолчанию и использовать версию-скрипт (или что-то еще) для экспорта символов?


person Jonathan Sternberg    schedule 14.11.2011    source источник
comment
Здесь gcc.gnu.org/wiki/Visibility говорится, что некоторые люди могут предположить, что GNU Сценарии версии компоновщика могут делать то же самое. Возможно, для программ C это верно, но для C++ это не может быть правдой... кажется, это не рекомендуется использовать.   -  person jw_    schedule 01.12.2019


Ответы (1)


Ваш вопрос не имеет смысла: зачем бороться -fvisibility со скриптом компоновщика, когда вы можете использовать скрипт компоновщика, чтобы экспортировать точно то, что вам нужно, и скрыть все остальное:

{
  global: foobar;
  local: *;
};

Обновлять:

Потому что код, который мне нужно использовать, использует __attribute__((visibility("default")))...

Сценарий компоновщика прекрасно работает с символами, помеченными таким образом. Пример:

// t.c
int __attribute__((visibility("default"))) foo() { return 1; }
int bar() { return 2; }
int __attribute__((visibility("default"))) exported() { return 3; }

// t.lds
{
  global: exported;
  local: *;
};

gcc t.c -Wl,--version-script=t.lds -fPIC -shared -o t.so && nm -D t.so
                 w _Jv_RegisterClasses
                 w __cxa_finalize
                 w __gmon_start__
00000000000004f2 T exported
person Employed Russian    schedule 15.11.2011
comment
Потому что код, в котором мне нужно использовать это, использует __attribute__((visibility(default))) в коде, чтобы иногда помечать видимость, но иногда он полагается на сценарий компоновщика. Способ, которым это обрабатывается прямо сейчас, - это просто гигантский взлом, и я пытаюсь выяснить, есть ли лучший способ сделать это. - person Jonathan Sternberg; 15.11.2011
comment
Ваш вопрос по-прежнему не имеет смысла. Вы можете попытаться объяснить, какой ваш настоящий вопрос лучше. - person Employed Russian; 15.11.2011
comment
Аннотации видимости предпочтительнее скриптов компоновщика, поскольку они допускают более агрессивную оптимизацию компиляторами. Скрипты по-прежнему необходимы для полной обрезки интерфейса внешней библиотеки из-за проблем в libgcc и ld. - person yugr; 06.10.2018