【问题标题】:Gulp/Node: error while loading shared libraries: cannot allocate memory in static TLS blockGulp/Node:加载共享库时出错:无法在静态 TLS 块中分配内存
【发布时间】:2018-01-20 06:55:30
【问题描述】:

尝试运行 gulp 并获得此输出

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

根据我的发现,这似乎与 gcc 或 g++ 有关,不确定它与 node 或 gulp 有何关系。无论哪种方式,我似乎都无法再运行 gulp 了。还应该提到,这是今天才出现的。昨天还好好的。

编辑:似乎它适用于所有节点命令。刚刚尝试运行 npm -v 来获取版本号,它具有相同的输出。与 node -v 相同

运行 CentOS 6.9

【问题讨论】:

    标签: node.js gcc npm gulp g++


    【解决方案1】:

    GNU 工具链支持各种类型的 TLS,其中一种(initial-exec 模型)涉及与线程控制块本质上的固定偏移量。在程序启动时,动态链接器会计算所有偏移量,并确保所有线程都有足够的空间来存储所有必需的线程局部变量。

    但是,对于dlopen,这通常不起作用,因为无法移动线程控制块来为更多线程局部变量腾出空间。当前的 glibc 动态链接器具有启发式方法,可为将来的 dlopen 调用保留一些空间,但是如果您加载许多共享对象,每个共享对象都会枯萎自己的线程局部变量,这还不够。

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

    在一般情况下,可能需要将一些共享对象切换到global-dynamic TLS 模型(这需要重新编译它们),或者使用增加了 TLS 保留的 glibc 构建。遗憾的是,目前无法在运行时设置保留。

    【讨论】:

    • 感谢您的回答,但这有点复杂。我只是想运行 gulp。作为最终用户,我应该在这里做什么?
    • 作为最终用户,您可能应该请那些向您提供 node.js 二进制文件的人修复它们。它可能会解决这个问题。
    • 谢谢!!很好 ! @BobbyS 只需在您的命令前添加 LD_PRELOAD=libjemalloc.so.2。但是 Flo 提供了 2 个很棒的解决方案(肮脏的 LD_PRELOAD 对我来说更容易工作,所以我不必重新编译和安装)。你拯救了我的一天@FlorianWeimer + 我学会了 LD_PRELOAD 技巧。我真的很感激!
    猜你喜欢
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2021-09-12
    • 2021-12-21
    • 2020-11-28
    • 1970-01-01
    相关资源
    最近更新 更多