Способ хранения 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
, и если да, то помогает ли сборка с ней.