我正在为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" ]
}
]
}
谢谢!
答案 0 :(得分:2)
您可能知道,节点本机模块是动态库。您
无法从动态库中剥离动态符号表,因为
动态符号表在运行时是动态链接库所必需的。
即使strip --strip-all
也不会删除动态符号表。 strip --strip-all
或strip --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" ]
}
]
}
可悲的是,我无法测试它,也不是平台独立的。