C ++破坏符号名称。然后可以在调试时使用这些名称 - 但仅限于二进制文件未被剥离。其他使用场景是共享库 - 符号名称可以在库中导出和显示。
但两者都是:
一个。剥离的构建,
湾和正常的非共享库构建
二进制文件中应该没有可用的符号吗?例如,字符串工具不会输出任何符号?
答案 0 :(得分:1)
strip
命令从图像中删除调试符号。在共享对象中导出的符号不是调试符号,并且不会被strip
删除。这些符号可用于定位功能/数据,但是它们不会将代码与源相关联。
答案 1 :(得分:1)
一个。剥离的构建
湾非共享库构建
目前尚不清楚您是否要求分别满足A)和B)或A)和B)场景的构建。
对于两者 - 非共享的剥离构建 - 是的,符号应该全部消失。
仅对于A),否:如果您使用共享库,则符号将(默认情况下)从其中导出,strip
将不会删除它们。如果您使用的是ELF
,则可以使用例如__attribute__((visibility("hidden")))
或同等机制。
仅对于B) - 非剥离的非共享构建,符号通常会出现在符号表中,因此strings
将显示它们。要摆脱它们,请使用strip
(将其转换为A)和B)合并)。
答案 2 :(得分:1)
在剥离的版本(a)中,不是共享库,没有可用的符号。
在“正常”构建中(既不调试也不剥离)(b),保留函数名称的符号,但不保留所有其他调试符号。在调试器中,您将能够捕获具有函数名称的堆栈跟踪,但不检查其参数或打印堆栈变量的值。