Почему shl_load() не работает для библиотек с локальным хранилищем потоков?

StackOverflow https://stackoverflow.com/questions/809571

Вопрос

Потоки в 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 вариант, и если да, то поможет ли его использование.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top