GNU binary utilities —— c++filt

GNU binary utilities (GNU Binutils) version 2.42: —— c++filt

个人笔记,仅供参考!!
c++filt [-_|–strip-underscore]
[-n|–no-strip-underscore]
[-p|–no-params]
[-t|–types]
[-i|–no-verbose]
[-r|–no-recurse-limit]
[-R|–recurse-limit]
[-s format|–format=format]
[–help] [–version] [symbol…]

C++ 和 Java 语言提供了函数重载的功能,这意味着你可以编写许多具有相同名称的函数,只要每个函数的参数类型不同即可。为了能够区分这些同名的函数,C++ 和 Java 将它们编码为低级汇编名称,这些名称唯一标识每个不同的版本。这一过程称为“符号重整”。c++filt 程序进行相反的映射:它将低级名称解码(去除重整),使其成为用户级别的名称,以便于阅读。

输入中的每个字母数字单词(由字母、数字、下划线、美元符号或句点组成)都是一个潜在的重整名称。如果名称解码为 C++ 名称,那么 C++ 名称将替换输出中的低级名称,否则输出原始单词。通过这种方式,你可以将包含重整名称的整个汇编源文件传递给 c++filt,并看到包含解码名称的相同源文件。

你还可以通过命令行传递符号来使用 c++filt 解码单个符号:c++filt symbol

如果未提供符号参数,则 c++filt 从标准输入读取符号名称。所有结果都会打印在标准输出上。从命令行读取名称与从标准输入读取名称的区别在于,命令行参数预期只是重整名称,不会进行检查以将它们与周围文本分开。例如:c++filt -n _Z1fv,将正确解码名称为 f(),而:c++filt -n _Z1fv,,将无法工作。(注意,重整名称末尾的额外逗号使其无效)。然而,以下命令是有效的:echo _Z1fv, | c++filt -n
并将显示 f(),,即解码后的名称后跟一个尾随逗号。这种行为是因为当从标准输入读取名称时,假设它们可能是汇编源文件的一部分,其中可能包含在重整名称后面的额外字符。例如:
.type _Z1fv, @function

选项:

-_ / –strip-underscore

在某些系统上,C 和 C++ 编译器会在每个名称前加一个下划线。例如,C 名称 foo 得到低级名称 _foo。此选项删除初始下划线。c++filt 是否默认删除下划线取决于目标。

-n / –no-strip-underscore

不要删除初始下划线。

-p –no-params

在解码函数名称时,不显示函数参数的类型。

-t –types

尝试解码类型和函数名称。默认情况下此选项被禁用,因为重整类型通常仅在编译器内部使用,并且它们可能与未重整的名称混淆。例如,一个名为 a 的函数被视为重整类型名称时,会解码为 signed char。

-i –no-verbose

不要在解码输出中包含实现细节(如果有)。

-r / -R / –recurse-limit / –no-recurse-limit / –recursion-limit / –no-recursion-limit

启用或禁用解码字符串时执行的递归量限制。由于名称重整格式允许无限递归级别,可能会创建一些字符串,其解码会耗尽主机机器上的堆栈空间,从而触发内存故障。该限制试图通过将递归限制为2048级嵌套来防止这种情况发生。

默认情况下启用此限制,但在解码非常复杂的名称时,可能需要禁用它。然而请注意,如果禁用递归限制,则可能发生堆栈耗尽,并且任何有关此类事件的错误报告都会被拒绝。

-r 选项是 –no-recurse-limit 选项的同义词。-R 选项是 –recurse-limit 选项的同义词。

-s format / –format=format

c++filt 可以解码由不同编译器使用的各种重整方法。此选项的参数选择它使用的方法:

  • auto:基于可执行文件的自动选择(默认方法)

  • gnu:GNU C++ 编译器(g++)使用的方法

  • lucid:Lucid 编译器(lcc)使用的方法

  • arm:C++ 注释参考手册指定的方法

  • hp:HP 编译器(aCC)使用的方法

  • edg:EDG 编译器使用的方法

  • gnu-v3:GNU C++ 编译器(g++)使用的 V3 ABI 方法

  • java:GNU Java 编译器(gcj)使用的方法

  • gnat:GNU Ada 编译器(GNAT)使用的方法

–help

打印 c++filt 选项的摘要并退出。

–version

打印 c++filt 的版本号并退出。

警告:c++filt 是一个新的工具,其用户界面的细节可能会在未来版本中发生变化。特别是,将来可能需要一个命令行选项来解码作为命令行参数传递的名称;换句话说,c++filt symbol在未来的版本中可能会变成:c++filt option symbol

参考连接:

【1】https://sourceware.org/binutils/docs-2.42/binutils/c_002b_002bfilt.html