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



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

它正在进行发布构建,但仍然包含符号表。

因此,我需要在构建后用strip unix命令将其删除。有没有办法将其删除在构建本身中 - 即。在.gyp文件中指定某些内容?

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

strings [node-module]

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

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

node-gyp rebuild --target=v8.9.4

这是我的绑定。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" ]
    }
  ]
}

谢谢!

您可能知道,节点本机模块是动态库。你无法从动态库中剥离动态符号表在运行时需要动态符号表,以动态链接库。甚至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
                                                        ^^^^^^^^

我已经搜索了一点,并且可能有一个蛮力解决方案,可以手动指定编译器标志-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" ]
    }
  ]
}

可悲的是,我无法对其进行测试,也不是平台独立。

最新更新