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

UnixForum





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

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


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

3.8. Использование DSO с контролем версий

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

Иногда, очень редко этот метод оказывается полезным. Если объект DSO ведет себя по-разному в зависимости от того, в какой контекст он загружен, и если в этом контексте должны быть предствлены некоторые функции обратного вызова, которые дополняют DSO, то можно пользоваться неопределенными символами. Но это не распространяется на определения из DSO, в которых использует контроль версий символов.

Проблема в том, что, если во время компиляции не используются объект DSO, в котором содержатся определения, то компоновщик не сможет добавить имя версии к неопределенной ссылке. Согласно правилам контроля версий символов [4] это означает, что используется самая ранняя версия, имеющаяся во время выполнения, которой версия обычно не назначается. Возвращаясь к примеру в разделе 3.7, предположим, что программы, использующие DSO, будут откомпилированы с предположением, что будет использоваться новый интерфейс index2. Компоновка происходит без объекта DSO, в котором содержится определение. Ссылка будет для index, а не для index@@VERS 2.0. Во время выполнения динамический компоновщик найдет неразрешенную ссылку и определения, использующие контроль версий. Затем он выберет самое старое определение, которым в нашем случае будет index1. Результат может быть катастрофическим.

Поэтому настоятельно рекомендуется никогда не иметь зависимости от неопределенных символов. Компоновщик может помочь это обеспечить, если в командную строку компилятора добавить параметр -Wl,-z,defs. Если действительно необходимо использовать неопределенные символы, то следует проверить только что собранный объект DSO с тем, чтобы убедиться, что соответствующим образом помечены все ссылки на символы в DSO, в которых используется контроль версий.


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