версия-скрипт и скрытая видимость - PullRequest
8 голосов
/ 15 ноября 2011

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

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

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

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

{
  global:
    foobar;
}

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

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

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

1 Ответ

10 голосов
/ 15 ноября 2011

Ваш вопрос не имеет смысла: зачем бороться -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
...