С++ -fvisibility = hidden -fvisibility-inlines-hidden

У меня есть вопрос о атрибуте видимости С++. Я прочитал http://gcc.gnu.org/wiki/Visibility, и все же я не совсем понимаю, как это работает.

Я хочу, чтобы видимость была скрыта в некоторых моих общих библиотеках, которые у меня есть. Я считаю, что это означает, что символы скрыты?

Как вы собираетесь связать общую библиотеку? Есть ли особый способ? Если я свяжу его, как он обычно связан, он не работает.

Может кто-нибудь мне помочь.

Ответы

Ответ 1

-fvisibility=hidden делает все ваши символы скрытыми по умолчанию.

То, что вам нужно сделать, - выбрать, какие функции вы хотите видеть пользователям, связанным с вашей библиотекой, и сделать их видимыми, пометив их видимым атрибутом.

например.

void __attribute__((visibility("default"))) Exported()
{
    // ...
}

Ответ 2

Это уменьшает сохранение ненужной информации о символах, которая является частной для общих объектов.

Рассмотрим общий объект, который содержит более 10 000 символов (функции/глобальные переменные), но только 100 из них являются публичными функциями, доступными из пользователей библиотеки. Мы можем сделать только 100 функций видимыми для других и оставшиеся 9 900 символов как частные.

Он также уменьшит размер общего объекта, так как в таблице перемещений будет отображаться только 100 символов. Использование этого флага вместе с -ffunction-sections -fdata-section приведет к уменьшению размера общего объекта путем определения, которое имеет отношение к этим 100 символам.