Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

На главную -> MyLDP -> Программирование и алгоритмические языки


Ulrich Drepper "Как писать разделяемые библиотеки"
Назад Оглавление Вперед

2.2.2. Определение глобальной видимости

Следующее, что лучше сделать при использовании static, это явно определить видимость объектов в DSO. В общем интерфейсе ELF ABI определено понятие видимости символов. В спецификации определены четыре класса, из которых нам интересны только два. STV DEFAULT обозначает обычную видимость. Символ экспортируется и может где-нибудь использоваться. Другой интересующий нас класс обозначается как STV HIDDEN. Символы, помеченные таким образом, не экспортируются из объекта DSO и, поэтому, их нельзя использовать из других объектов. Есть ряд различных способов определения видимости.

Начиная с версии 4.0, компилятору gcc известно о параметре командной строки -fvisibility. Он использует этот параметр, причем его допустимыми вариантами являются следующие:

-fvisibility=default
-fvisibility=hidden
-fvisibility=internal
-fvisibility=protected

Использовать следует только первые два варианта. Вариант default, что очевидно из названия, используется по умолчанию, так как это тот вариант действий компилятора, который был до появления этого параметра. Когда указывается -fvisibility=hidden, компилятор gcc для всех определяемых символов, для которых область видимости явно не указана, изменяет видимость, которая должна была использоваться по умолчанию,: все символы, если не указано иное, определяются с STV HIDDEN. Этим параметром нужно пользоваться осторожно, поскольку в случае, если объект DSO создан не так, чтобы все имеющиеся в нем интерфейсы API были бы помечены как имеющие видимость по умолчанию, то сгенерированный объект DSO не будет иметь единственного экспортируемого символа. Как правило, это не то, что требуется.

В целом, решение о том, будет ли использоваться параметр -fvisibility=hidden, отдается на откуп автору. Если он не используется, символы, которые не должны экспортироваться, должны быть так или иначе помечены. Подробности будут рассматриваться в следующем разделе. В случае, если этот параметр используется, все экспортируемые функции должны быть объявлены как имеющие видимость по умолчанию, что обычно означает, что заголовочные файлы будут существенно искажены. С другой стороны это означает, что символ не может быть случайно экспортирован, поскольку отсутствует соответствующее объявление и т.д. В некоторых ситуациях это может предотвратить появления нехороших сюрпризов {Примечание 8}.

Примечание 8: Случайно экспортируемый символ может означать, что его могут использовать программы и могут от него зависеть. Тогда по причине двоичной совместимости снова удалить этот символ будет трудно.

Предыдущий раздел:   Следующий раздел:
Назад Оглавление Вперед