Почему shl_load() не работает для библиотек с локальным хранилищем потоков?
-
03-07-2019 - |
Вопрос
Потоки в Perl по умолчанию занимают собственное локальное хранилище для всех переменных, чтобы минимизировать влияние потоков на существующий код, не поддерживающий потоки.В Perl переменную, совместно используемую потоком, можно создать с помощью атрибута:
use threads;
use threads::shared;
my $localvar;
my $sharedvar :shared;
Загрузчик среды выполнения HP-UX не поддерживает динамическую загрузку общих библиотек, содержащих локальное хранилище потоков (TLS).
В результате при попытке импортировать модули, содержащие TLS, выдается следующая ошибка:
"/usr/lib/dld.sl: Can't shl_load() a library containing Thread Local Storage"
Итак, я знаю, почему получаю сообщение об ошибке. Мне просто неясно, почему будет сложно загрузить библиотеку с помощью TLS?
Решение
Способ настройки хранилища TLS зависит от доступа TLS. модель.
В более простой модели «Начальный исполняемый файл/статический TLS» загрузчик устанавливает сегмент TLS перед выполнением первой инструкции основного исполняемого файла.Он вычисляет размер этого сегмента путем сложения требований TLS для основного исполняемого файла и всех общих библиотек, от которых он напрямую зависит.
Как только этот сегмент TLS выделен и настроен, приложение начинает работать и вполне может сохранять указатели на сегмент TLS.Следовательно, невозможно realloc()
хранилище для сегмента — загрузчик не будет знать, какие указатели в приложении необходимо обновить.
Поскольку вы не можете перераспределить сегмент и в нем нет места для дополнительных переменных;как загрузчик может работать с динамически загружаемыми библиотеками, которым требуется собственное хранилище TLS?
Загрузчик glibc фактически выделяет дополнительное пространство в исходном TLS, поэтому может динамически загружать библиотеки с помощью TLS, при условии, что они не занимают слишком много места.Как только этот резерв будет исчерпан, загрузчик glibc также откажется загружать любые дополнительные библиотеки с требованиями TLS.
В Solaris и Linux можно динамически загружать библиотеки с произвольными требованиями TLS, используя «Общий динамический TLS». модель".
Похоже тоже на HP-UX v1.6 поддерживает эту модель и фактически делает ее моделью по умолчанию.Но вы, вероятно, используете более старую версию ОС, в которой эта модель не используется по умолчанию и может вообще не поддерживаться.Проверьте, поддерживает ли ваша версия компилятора +tls=dynamic
вариант, и если да, то поможет ли его использование.