C ++中的符号 - 它们是在非调试版本中导出的吗?

时间:2012-09-04 00:45:51

标签: linker export name-mangling

C ++破坏符号名称。然后可以在调试时使用这些名称 - 但仅限于二进制文件未被剥离。其他使用场景是共享库 - 符号名称可以在库中导出和显示。

但两者都是:

一个。剥离的构建,

湾和正常的非共享库构建

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

3 个答案:

答案 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),保留函数名称的符号,但不保留所有其他调试符号。在调试器中,您将能够捕获具有函数名称的堆栈跟踪,但不检查其参数或打印堆栈变量的值。