Почему shl_load () не работает для библиотек с локальным хранилищем потоков? - PullRequest
1 голос
/ 01 мая 2009

Потоки в 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?

1 Ответ

2 голосов
/ 10 мая 2009

Способ хранения TLS зависит от доступа TLS модель .

В более простой модели "Исходный исполняемый / статический TLS" загрузчик устанавливает сегмент TLS перед выполнением первой инструкции основного исполняемого файла. Он вычисляет размер этого сегмента, суммируя требования TLS основного исполняемого файла и всех общих библиотек, от которых он напрямую зависит.

Как только этот сегмент TLS выделен и настроен, приложение запускается и вполне может хранить указатели на сегмент TLS. Следовательно, realloc() хранилище для сегмента невозможно - загрузчик не будет знать, какие указатели в приложении должны быть обновлены.

Поскольку вы не можете перераспределить сегмент, и поскольку в нем нет места для дополнительных переменных; Как загрузчик может работать с динамически загружаемыми библиотеками, для которых требуется собственное хранилище TLS?

Загрузчик glibc фактически выделяет некоторое дополнительное пространство в исходном TLS, и поэтому может динамически загружать библиотеки с TLS, при условии, что они не используют слишком много места. Как только этот резерв исчерпан, загрузчик glibc также откажется загружать любые дополнительные библиотеки с требованиями TLS.

В Solaris и Linux можно динамически загружать библиотеки с произвольными требованиями TLS, используя «General Dynamic TLS модель ».

Похоже, что HP-UX v1.6 также поддерживает эту модель и фактически делает ее стандартной. Но вы, вероятно, используете старую версию ОС, где эта модель не используется по умолчанию и может вообще не поддерживаться. Проверьте, поддерживает ли ваша версия компилятора опцию +tls=dynamic, и если да, то помогает ли сборка с ней.

...