Pergunta

Tópicos no Perl por padrão levar seu próprio armazenamento local para todas as variáveis, para minimizar o impacto dos tópicos em code-non-thread ciente existente. Em Perl, uma variável compartilhada-thread pode ser criado usando um atributo:

use threads;
use threads::shared;

my $localvar;
my $sharedvar :shared; 

HP-UX carregador de tempo de execução não suporta carga dinâmica de bibliotecas compartilhadas que contêm (TLS) armazenamento local de thread.
Como resultado, ao tentar módulos de importação que contêm TLS o seguinte erro é relatado:

"/usr/lib/dld.sl: Can't shl_load() a library containing Thread Local Storage"

Então, eu sei porque eu estou recebendo um erro Eu sou apenas não está claro o motivo por que seria difícil carregar uma biblioteca com TLS?

Foi útil?

Solução

A forma de armazenamento TLS está configurado depende do acesso TLS modelo .

No "TLS estático executável Inicial /" modelo mais simples, os conjuntos carregadeira em segmento TLS antes da primeira instrução do executável principal é executado. Ele calcula o tamanho desse segmento somando requisitos TLS das principais bibliotecas executáveis ??e todos compartilhados lo diretamente depende.

Uma vez que este segmento TLS é alocado e configurado, o aplicativo começa a ser executado, e pode muito bem armazenar ponteiros para o segmento de TLS. Por isso, é impossível de armazenamento realloc() para o segmento -. O carregador não teria nenhuma idéia que os ponteiros na aplicação deve ser atualizado

Uma vez que você não pode realloc o segmento, e já que não há espaço nele para as variáveis ??adicionais; como pode carregadeira lidar com bibliotecas carregadas dinamicamente, que exigem armazenamento TLS própria?

O carregador glibc realmente aloca algum espaço extra nas TLS iniciais, e por isso pode dinamicamente carregar bibliotecas com TLS, desde que eles não usam muito espaço. Uma vez que esta reserva está esgotado, carregador glibc também irá se recusar a carregar quaisquer bibliotecas adicionais com os requisitos TLS.

No Solaris e Linux, é possível bibliotecas carregar dinamicamente com requisitos TLS arbitrários, usando o "General dinâmico TLS modelo ".

Parece que HP-UX v1.6 também suportes esse modelo, e na verdade torna o padrão. Mas você provavelmente está executando uma versão OS mais velho, onde este modelo não é o padrão, e não pode ser suportado. Verifique se a sua versão do compilador suportes +tls=dynamic opção, e se assim se construindo com ajuda.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top