RISC-V Binutils工具链14之c++filt工具的使用

RISC-V Binutils工具链14之c++filt工具的使用

c++filt是一个符号解修饰工具,用于将编译器生成的 “mangled”(修饰)符号名 还原为人类可读的原始函数名、类名、模板等。
常见于分析 g++clang++ 编译后的符号表、崩溃日志、nm/objdump 输出等。

1 c++filt 工具常用选项

$ riscv64-unknown-linux-gnu-c++filt --help

输出log见:riscv64-unknown-linux-gnu-c++filt_help

2 c++filt基本使用方法

C++ 支持函数重载、命名空间、类、模板等特性,所以几个函数可能具有相同的名称但入参类型不同。为了在编译后的二进制文件中唯一标识这些函数,编译器会对函数名进行编码(这个过程叫做名字修饰),编码后的函数名不易阅读,查看反汇编很困难,所以需要工具对编码后的函数名进行反修饰( demangling)。

c++filt 的作用就是将这些被修饰的符号名“解码”回原始的、可读的 C++ 函数名。注意:c++filt 默认情况下不能进行 C++ 名字编码(mangling),它是一个单向的解码(demangling)工具。

例如:如下opencv的反汇编片段,其中_ZN2cv6imreadERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi经过了名字修饰,不易阅读

1fa92:       12010d13                addi    s10,sp,288
1fa96:       856a                    mv      a0,s10
1fa98:       4601                    li      a2,0
1fa9a:       85a2                    mv      a1,s0
1fa9c:       1da090ef                jal     28c76 <_ZN2cv6imreadERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi>
1faa0:       8522                    mv      a0,s0
1faa2:       00ef6097                auipc   ra,0xef6

可以使用c++filt来进行处理:

$ riscv64-unknown-linux-gnu-c++filt _ZN2cv6imreadERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi

结果为:

cv::imread(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)

即为cv::imread函数

3 c++filt更多功能

解码多个符号:

$ riscv64-unknown-linux-gnu-c++filt _Z4funci _Z4funcd _ZN5MyClassC1Ev

结合其他工具使用:

查看目标文件中的符号,并解码 C++ 名字

$ riscv64-unknown-linux-gnu-nm opencv.o | riscv64-unknown-linux-gnu-c++filt

4 网页反修饰工具

也可以使用在线 demangler 工具,输入符号即可看到结果

https://demangler.com/

posted @ 2026-08-29 16:26  sureZ_ok  阅读(6)  评论(0)    收藏  举报