NodeJS本机模块 - 如何删除调试符号

时间:2018-02-23 13:03:38

标签: c++ node.js debug-symbols

我正在为Node编写本机模块,但想要删除调试信息。 我正在使用node-gyp来构建模块。

它正在进行发布构建,但是,符号表仍包含在输出文件中。

所以我需要在构建之后使用strip Unix命令将其删除。 有没有办法在构建本身中删除它 - 即。在.gyp文件中指定一些东西?

此外,即使在剥离调试符号后,我仍然可以使用

strings [node-module]

它列出了我的功能名称。是否有可能删除这些?

这是我用来构建本机模块的命令:

node-gyp rebuild --target=v8.9.4

这是我的binding.gyp:

{
  "targets": [
    {
      "libraries": [
          "/usr/lib/x86_64-linux-gnu/libudev.so",
          "/usr/lib/x86_64-linux-gnu/libboost_regex.so.1.58.0"
      ],
      "target_name": "utils",
      "sources": [ "src/native/utils.cpp" ]
    }
  ]
}

谢谢!

2 个答案:

答案 0 :(得分:2)

您可能知道,节点本机模块是动态库。您 无法从动态库中剥离动态符号表,因为 动态符号表在运行时是动态链接库所必需的。 即使strip --strip-all也不会删除动态符号表。 strip --strip-allstrip --strip-unneeded 剥离可以从动态库中删除的所有内容。将-g0添加到编译标志中 消除所有调试信息,但符号表包含多个 调试信息。

您可以指示链接器执行与strip --strip-all相同的操作 链接时通过传递选项-s|--strip-all。为此,您的binding.gyp 将是:

{
    "targets": [
    {
        "libraries": [
            "/usr/lib/x86_64-linux-gnu/libudev.so",
            "/usr/lib/x86_64-linux-gnu/libboost_regex.so.1.58.0"
        ],
        "target_name": "utils",
        "ldflags" : [ "-Wl,-s" ],
        "sources": [ "src/native/utils.cpp" ],
    }
  ]
}

生成的节点模块随后被剥离为共享库可以是:

$ file ./build/Release/utils.node
./build/Release/utils.node: ELF 64-bit LSB shared object, x86-64, \
version 1 (SYSV), dynamically linked, \
BuildID[sha1]=eb53cee5839c71b41176bc7a852802035009e8ae, stripped
                                                        ^^^^^^^^

答案 1 :(得分:1)

我已经搜索了一下,可能会有一个蛮力的解决方案,即手动指定编译器标志-g0。看看这里:https://github.com/nodejs/node-gyp/issues/26。因此,根据您在github问题中给出的示例和建议,输入文件应如下所示:

{
  "targets": [
    {
      "libraries": [
          "/usr/lib/x86_64-linux-gnu/libudev.so",
          "/usr/lib/x86_64-linux-gnu/libboost_regex.so.1.58.0"
      ],
      "target_name": "utils",
      "cflags_cc": [ "-g0" ]
      "sources": [ "src/native/utils.cpp" ]
    }
  ]
}

可悲的是,我无法测试它,也不是平台独立的。