Nodejs本机模块 - 如何删除调试符号
NodeJS native module - how to remove debug symbols
我正在为节点编写本机模块,但想删除调试信息。我正在使用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-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
^^^^^^^^
我已经搜索了一点,并且可能有一个蛮力解决方案,可以手动指定编译器标志-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" ]
}
]
}
可悲的是,我无法对其进行测试,也不是平台独立。
相关文章:
- 有没有一种预处理器的方法可以从调试符号中删除代码段
- 从静态库中去除/删除调试符号和存档名称
- Nodejs本机模块 - 如何删除调试符号
- GNU 调试器无法从显示中删除变量?
- 单例:为什么不需要删除并且看不到析构函数调试消息
- 链表调试(删除C++关键字神秘)?
- 删除SDL_VideoInfo指针时调试断言失败
- 正在删除导致调试断言的指针
- 为什么当我删除此字符 * 时,调试断言失败block_type_is_valid
- 删除对象时调试断言失败
- 删除目录的函数仅在调试完成 c++ 后将其删除
- 如何在C++中调试双重删除
- NDK如何在发布时删除日志调试语句
- 删除时出现C++内存错误-调试断言失败
- 删除Xcode 5.1项目中的所有调试表达式
- 是否有可能调试最初由可执行文件生成的已删除符号的核心文件?
- 删除Visual c++ 2003中的调试符号
- Linux 上 eclipse 中的清理项目不会删除调试/发布文件夹
- 编译时从发布二进制文件中删除调试打印
- 在发布代码c++中删除调试代码