Gulp / Node:加载共享库时出错:无法在静态TLS块中分配内存

尝试运行吞咽和获得这个输出

$ gulp node: error while loading shared libraries: cannot allocate memory in static TLS block 

从我发现,这似乎与gcc或g ++有关,不知道它是如何与节点或吞咽。 无论哪种方式,我似乎无法运行吞咽了。 还应该提一下,今天刚刚出现。 昨天运行良好。

编辑:似乎是所有的节点命令。 试着运行npm -v来获取版本号,它有相同的输出。 与节点-v相同

运行CentOS 6.9

GNU工具链支持各种types的TLS,其中一个( initial-exec模型)涉及线程控制块本质上固定的偏移量。 在程序启动时,dynamic链接器计算所有的偏移量,并确保所有线程都有足够的空间用于所有需要的线程局部variables。

但是,对于dlopen ,这通常不起作用,因为不可能移动线程控制块来为更multithreading局部variables腾出空间。 当前的glibcdynamic链接器有一个启发式的方法,为将来的dlopen调用保留一些空间,但是如果你加载了一些共享对象,每个都会使自己的线程局部variables枯萎,这是不够的。

通常的解决方法是使用LD_DEBUG=files环境variables(或strace )来查找使用dlopen加载的相关共享对象(不幸的是,您引用的错误消息不提供此信息)。 之后,您可以使用LD_PRELOAD环境variables来告诉dynamic链接器提前加载它们。 (这对于共享对象来说是足够的,因为它是自动处理的。)这有副作用,程序启动时的计算考虑到它们的TLS需求,并且在稍后运行dlopen调用时时间,不需要分配额外的TLSvariables。 但是,这种方法不适用于所有共享对象,因为它影响符号查找以及ELF构造函数的运行顺序。

在一般情况下,可能有必要将一些共享对象切换到global-dynamic TLS模型(需要重新编译它们),或者使用glibc构build和增加的TLS保留。 不幸的是,保留区目前不能在运行时设置。