NodeJS 本机模块 - 如何删除调试符号
NodeJS native module - how to remove debug symbols
我正在为 Node 编写本机模块,但想删除调试信息。
我正在使用 node-gyp 构建模块。
它正在进行发布构建,但符号 table 仍包含在输出文件中。
因此我需要在构建后使用 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" ]
}
]
}
谢谢!
我搜索了一下,可能有一个手动指定编译器标志 -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" ]
}
]
}
遗憾的是,我无法对其进行测试,而且它与平台无关。
您可能知道,节点本机模块是一个动态库。你
无法从动态库中删除动态符号 table,因为
动态符号 table 在运行时对于动态链接库是必需的。
即使 strip --strip-all
也不会删除动态符号 table。 strip --strip-all
或 strip --strip-unneeded
删除所有可以 从动态库中删除的内容。将 -g0
添加到编译标志
消除所有 调试 信息,但符号 table 包含超过
调试信息。
您可以指示链接器做与 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
^^^^^^^^
我正在为 Node 编写本机模块,但想删除调试信息。 我正在使用 node-gyp 构建模块。
它正在进行发布构建,但符号 table 仍包含在输出文件中。
因此我需要在构建后使用 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" ]
}
]
}
谢谢!
我搜索了一下,可能有一个手动指定编译器标志 -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" ]
}
]
}
遗憾的是,我无法对其进行测试,而且它与平台无关。
您可能知道,节点本机模块是一个动态库。你
无法从动态库中删除动态符号 table,因为
动态符号 table 在运行时对于动态链接库是必需的。
即使 strip --strip-all
也不会删除动态符号 table。 strip --strip-all
或 strip --strip-unneeded
删除所有可以 从动态库中删除的内容。将 -g0
添加到编译标志
消除所有 调试 信息,但符号 table 包含超过
调试信息。
您可以指示链接器做与 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
^^^^^^^^