【问题标题】:Undefined symbol when loading node addon after updating node.js from v8 to v12将node.js从v8更新到v12后加载节点插件时未定义的符号
【发布时间】:2020-11-23 14:51:10
【问题描述】:

我已将我的节点从 v8.16.2 更新到 v12.18.3。 当我现在尝试加载我的插件时,我遇到了这个错误:

$ /usr/bin/node -e "require('/home/user1/addon.node')"

internal/modules/cjs/loader.js:1187
  return process.dlopen(module, path.toNamespacedPath(filename));
                 ^

Error: /home/user1/addon.node: undefined symbol:
_ZNK2v88Function11NewInstanceEiPNS_5LocalINS_5ValueEEE
    at Object.Module._extensions..node (internal/modules/cjs/loader.js:1187:18)
    at Module.load (internal/modules/cjs/loader.js:985:32)
    at Function.Module._load (internal/modules/cjs/loader.js:878:14)
    at Module.require (internal/modules/cjs/loader.js:1025:19)
    at require (internal/modules/cjs/helpers.js:72:18)
    at [eval]:1:1
    at Script.runInThisContext (vm.js:120:18)
    at Object.runInThisContext (vm.js:309:38)
    at Object.<anonymous> ([eval]-wrapper:10:26)
    at Module._compile (internal/modules/cjs/loader.js:1137:30)

我发现这个未定义的符号 _ZNK2v88Function11NewInstanceEiPNS_5LocalINS_5ValueEEE 以前在节点二进制文件本身中定义(在节点 v8 中更新到节点 v12 之前)。 我没有改变我构建节点的方式。那就是脚本“配置”的参数没有改变,它们对于节点 v8 和节点 v12 都是相同的。 但是,现在这个缺失的符号不再在节点 v12 的节点二进制文件中定义。有谁知道为什么会这样?

对于节点 v12,此符号未定义:

$ readelf -Ws node | grep _ZNK2v88Function11NewInstanceEiPNS_5LocalINS_5ValueEEE

(no any output)

对于节点 v8,定义了这个符号:

$ readelf -Ws node |grep _ZNK2v88Function11NewInstanceEiPNS_5LocalINS_5ValueEEE

66565: 00000000005167a8 84 FUNC GLOBAL DEFAULT 13 _ZNK2v88Function11NewInstanceEiPNS_5LocalINS_5ValueEEE

为什么节点 v12 中不再定义此符号?

谢谢你, 阿列克谢。

【问题讨论】:

  • 版本 8 和 12 之间有很多变化。听起来您正在使用 nan 构建插件。也许添加更多关于您是否使用 nan、n-api 或 node-addon-api 的信息会有所帮助。如果您使用的是 nan,那么您需要更新您正在使用的 nan 版本。
  • FWIW, c++filt 将去错名显示为:v8::Function::NewInstance(int, v8::Local<:>*) 常量

标签: node.js node.js-addon


【解决方案1】:

v8::Function::NewInstance(int, v8::Local&lt;v8::Value&gt;*) 在 Node.js v10 中被移除。替换将v8::Local&lt;v8::Context&gt; 作为其第一个参数:https://v8docs.nodesource.com/node-10.15/d5/d54/classv8_1_1_function.html#aac8391b7c084a5b487954990fdc9acf4

您可以使用 v8::Isolate::GetCurrent()-&gt;GetCurrentContext() 获取上下文,或者,如果您使用的是 NAN,则可以使用 Nan::GetCurrentContext()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    相关资源
    最近更新 更多