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