默认情况下,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 model "。

看起来HP-UX v1.6也支持那个模型,实际上是默认的。但是您可能正在运行较旧的操作系统版本,此版本不是默认版本,可能根本不受支持。检查您的编译器版本是否支持 + tls = dynamic 选项,如果是,那么使用它构建是否有帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top