1

C++ 会破坏符号名称。然后可以在调试时使用这些名称——但前提是没有剥离二进制文件。其他使用场景是共享库——符号名称可以导出并在库中可见。

但在两者中:

一种。剥离构建,

湾。和正常的非共享库构建

二进制文件中应该没有可用的符号?例如,字符串工具不会输出任何符号?

4

3 回答 3

1

该命令从映像strip中删除调试符号。在共享对象中导出的符号不是调试符号,不会被strip. 这些符号可用于定位函数/数据,但它们不会将代码与源相关联。

于 2012-09-04T00:49:44.980 回答
1

一种。剥离构建

湾。非共享库构建

目前尚不清楚您是在询问满足 A) 和 B) 的构建,还是分别满足 A) 和 B) 场景的构建。

对于两者 - 非共享,剥离构建 - 是的,符号应该全部消失。

仅适用于 A),否:如果您使用的是共享库,则符号将(默认情况下)从中导出,并且strip不会删除它们。如果您正在使用ELF,则可以使用 eg__attribute__((visibility("hidden")))或等效机制限制符号可见性。

对于 B)——非剥离、非共享构建,符号通常会出现在符号表中,因此strings会显示它们。要摆脱它们,请使用strip(将其变为 A)和 B)组合)。

于 2012-09-04T03:09:34.543 回答
1

在不是共享库的剥离构建 (a) 中,没有可用的符号。

在“正常”构建(既不调试也不剥离)(b)中,函数名称的符号被保留,但所有其他调试符号都没有。在调试器中,您将能够使用函数名称捕获堆栈跟踪,但不能检查它们的参数或打印堆栈变量的值。

于 2012-09-04T03:15:34.697 回答