0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

c++filt命令:用于解析C++和Java中被修饰的符号

Linux爱好者 来源:Linux爱好者 作者:恋猫大鲤鱼 2021-02-09 18:22 次阅读

1.命令简介

c++filt 命令可用于解析 C++ 和 Java 中被修饰的符号,比如变量与函数名称。

我们知道, 在 C++ 和 Java 中, 允许函数重载,也就是说我们可以写出多个同名但参数类型不同的函数,其实现依赖于编译器的名字改编(Name Mangling)机制,即编译器会将函数的名称进行修饰,加入参数信息。考察如下程序:

使用 g++ 编译上面的 print.cpp 生成目标文件 print.o。

g++-cprint.cpp-oprint.o

然后使用命令 strings 查找 print.o 中的可打印字符串。

stringsprint.o
readelf
GCC:(GNU)4.8.520150623(RedHat4.8.5-4)
.symtab
.strtab
.shstrtab
.rela.text
.data
.bss
.rodata
.rela.init_array
.comment
.note.GNU-stack
.rela.eh_frame
print.cpp
_ZStL8__ioinit
_Z41__static_initialization_and_destruction_0ii
_ZL5dTest
_GLOBAL__sub_I__Z5printRKSs
_Z5printRKSs
_ZSt4cout
_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E
_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
_ZNSolsEPFRSoS_E
_ZNSt8ios_base4InitC1Ev
__dso_handle
_ZNSt8ios_base4InitD1Ev
__cxa_atexit

找到其中两个字符串,分别是_ZL5dTest_Z5printRKSs,根据其包含的内容,我们大致能够猜测,两个字符串分别对应源码中的常量 dTest 和函数 print()。使用 c++filt 进行符号解析(symbol demangling)来验证我们的猜想。

c++filt_ZL5dTest
dTest

c++filt_Z5printRKSs
print(std::basic_string,std::allocator>const&)

猜测正确,源码文件中的变量名和函数名被修饰后,通过 c++filt 命令可以还原回来,这正是 c++filt 命令的功能。

2.命令格式

c++filt[-_|--strip-underscore]
[-n|--no-strip-underscore]
[-p|--no-params]
[-t|--types]
[-i|--no-verbose]
[-sformat|--format=format]
[--help][--version][symbol...]

注意,如果没有给出符号参数 [symbol…],c++filt 将从标准输入中读取符号名称。

3.选项说明

-_,--strip-underscore
在某些系统中,C和C++编译器都在每个名字前面加下划线。例如,C 名称 foo 获得低级名称为_foo。此选项用于删除初始下划线,c++filt 是否默认删除下划线是依赖于目标的
-n,--no-strip-underscore
不删除初始下划线
-p,--no-params
当解析函数名时,不显示函数参数的类型
-t,--types
试图解析类型与函数名
-i,--no-verbose
输出结果中不包括任何实现细节
-s,--format=FORMAT
c++filt 可以解析不同编译器修饰的符号,此选项用于指明符号修饰所采用的方法:
"auto":根据可执行文件自动选择符号解析方法,此为默认选项
"gnu":GNU C++ compiler (g++)的符号修饰方法
"lucid":Lucid compiler (lcc)的符号修饰方法
"arm":C++ Annotated Reference Manual 指明的方法
"hp":HP compiler (aCC)的符号修饰方法
"edg":EDG compiler 的符号修饰方法
"gnu-v3":GNU C++ compiler (g++) with the V3 ABI 的符号修饰方法
"java":GNU Java compiler (gcj)的符号修饰方法
"gnat":GNU Ada compiler (GNAT)的符号修饰方法
--help
显示帮助信息
--version
显示版本信息
@FILE
从文件 FILE 中读取命令行选项,读取的选项将插入到@FILE 选项的位置。如果文件不存在,或者无法读取,那么选项@FILE 将被按照字面意义处理,而不是被忽略

4.常用示例

(1)解析编译器 g++ 修饰的函数名称。还是以第一节“1.命令简介”中函数 print() 的名字为例。

c++filt-sgnu-v3_Z5printRKSs
print(std::basic_string,std::allocator>const&)

(2)解析编译器 g++ 修饰的函数名称,但不显示函数参数类型。

c++filt-p_Z5printRKSs
print

(3)解析编译器 g++ 修饰的变量名称。还是以第一节“1.命令简介”中变量 dTest 的名字为例。

c++filt_ZL5dTest
dTest

参考文献

[1] c++filt manual
[2] mangle和demangle

责任编辑:xj

原文标题:每天一个 Linux 命令(105):c++filt 命令

文章出处:【微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11222

    浏览量

    208886
  • C++
    C++
    +关注

    关注

    22

    文章

    2104

    浏览量

    73482

原文标题:每天一个 Linux 命令(105):c++filt 命令

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言和C++中结构体的区别

    同样是结构体,看看在C语言和C++中有什么区别?
    的头像 发表于 10-30 15:11 134次阅读

    C7000优化C/C++编译器

    电子发烧友网站提供《C7000优化C/C++编译器.pdf》资料免费下载
    发表于 10-30 09:45 0次下载
    <b class='flag-5'>C</b>7000优化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>编译器

    C语言与Java语言的对比

    C语言和Java语言都是当前编程领域中的重要成员,它们各自具有独特的优势和特点,适用于不同的应用场景。以下将从语法特性、内存管理、跨平台性、性能、应用领域等多个方面对C语言和
    的头像 发表于 10-29 17:31 193次阅读

    OpenHarmony标准系统C++公共基础类库案例:HelloWorld

    1、程序简介该程序是基于凌蒙派OpenHarmony-v3.2.1标准系统C++公共基础类库的简单案例:HelloWorld。主要讲解C++公共基础类库案例如何搭建和编译。2、程序解析2.1、创建
    的头像 发表于 08-13 08:23 460次阅读
    OpenHarmony标准系统<b class='flag-5'>C++</b>公共基础类库案例:HelloWorld

    C++语言基础知识

    电子发烧友网站提供《C++语言基础知识.pdf》资料免费下载
    发表于 07-19 10:58 7次下载

    C++中实现类似instanceof的方法

    C++有多态与继承,但是很多人开始学习C++,有时候会面临一个常见问题,就是如何向下转型,特别是不知道具体类型的时候,这个时候就希望C++ 可以向Java或者Python中有insta
    的头像 发表于 07-18 10:16 529次阅读
    <b class='flag-5'>C++</b>中实现类似instanceof的方法

    鸿蒙OS开发实例:【Native C++

    使用DevEco Studio创建一个Native C++应用。应用采用Native C++模板,实现使用NAPI调用C标准库的功能。使用C标准库hypot接口计算两个给定数平方和的平
    的头像 发表于 04-14 11:43 2496次阅读
    鸿蒙OS开发实例:【Native <b class='flag-5'>C++</b>】

    使用 MISRA C++:2023® 避免基于范围的 for 循环中的错误

    在前两篇博客中,我们 向您介绍了新的 MISRA C++ 标准 和 C++ 的历史 。在这篇博客中,我们将仔细研究以 C++ 中 for 循环为中心的特定规则。
    的头像 发表于 03-28 13:53 734次阅读
    使用 MISRA <b class='flag-5'>C++</b>:2023® 避免基于范围的 for 循环中的错误

    c语言,c++,java,python区别

    C语言、C++Java和Python是四种常见的编程语言,各有优点和特点。 C语言: C语言是一种面向过程的编程语言。它具有底层的特性,能
    的头像 发表于 02-05 14:11 2227次阅读

    C++简史:C++是如何开始的

    MISRA C++:2023,MISRA® C++ 标准的下一个版本,来了!为了帮助您做好准备,我们介绍了 Perforce 首席技术支持工程师 Frank van den Beuken 博士撰写
    的头像 发表于 01-11 09:00 529次阅读
    <b class='flag-5'>C++</b>简史:<b class='flag-5'>C++</b>是如何开始的

    C语言和C++中那些不同的地方

    C语言虽说经常和C++在一起被大家提起,但可千万不要以为它们是一个东西。现在我们常用的C语言是C89标准,C++
    的头像 发表于 12-07 14:29 902次阅读
    <b class='flag-5'>C</b>语言和<b class='flag-5'>C++</b>中那些不同的地方

    eclipse怎么使用命令

    Eclipse是一种功能强大的集成开发环境(IDE),可用于开发各种类型的应用程序,包括JavaC/C++、Python等。虽然Eclipse提供了用户友好的图形用户界面,但有时候我
    的头像 发表于 12-06 11:26 2421次阅读

    开箱即用!教你如何正确使用华为云CodeArts IDE for C/C++

    华为云CodeArts IDE 定位华为云开发者桌面 ,是华为云面向开发者提供的一款智能化桌面集成开发环境。CodeArts IDE for C/C++集成了华为自研的C/C++语言服
    的头像 发表于 11-29 17:40 750次阅读
    开箱即用!教你如何正确使用华为云CodeArts IDE for <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>!

    如何选择创建c语言和c++

    选择创建 C 语言和 C++ 都需要综合考虑多个因素。在决定使用哪种语言之前,我们需要对这两种语言的特点、优缺点、适用场景、学习成本等进行全面的了解和对比。下面是关于选择创建 C 语言和 C+
    的头像 发表于 11-27 15:58 567次阅读

    c++怎么开始编程

    C++是一种高级的、通用的编程语言,用于开发各种类型的应用程序。它是从C语言演变而来,也是一种静态类型语言,可以在不同的平台上进行开发。C++具有高度的灵活性和性能,并且广泛应
    的头像 发表于 11-27 15:56 889次阅读