C++符号的还原(demangling)

更新时间:2023-11-06 01:06:15 阅读: 评论:0


2023年11月6日发(作者:严芸)

C++符号的还原(demangling

C++符号

Name Mangling概述

⼤型程序是通过多个模块构建⽽成,模块之间的关系由makefile来描述。对于由C++语⾔编制的⼤型程序⽽⾔,也是符合这

个规则。

程序的构建过程⼀般为:各个源⽂件分别编译,形成⽬标⽂件。多个⽬标⽂件通过链接器形成最终的可执⾏程序。显然,从

某种程度上说,编译器的输出是链接器的输⼊,链接器要对编译器的输出做⼆次加⼯。从通信的⾓度看,这两个程序需要⼀

定的协议来规范符号的组织格式。这就是Name Mangling产⽣的根本原因。

C++的语⾔特性⽐C丰富的多,C++⽀持的函数重载功能是需要Name Mangling技术的最直接的例⼦。对于重载的函数,不

能仅依靠函数名称来区分不同的函数,因为C++中重载函数的区分是建⽴在以下规则上的:

函数名字不同 || 参数数量不同||某个参数的类型不同

那么区分函数的时候,应该充分考虑参数数量和参数类型这两种语义信息,这样才能为却分不同的函数保证充分性。

当然,C++还有很多其他的地⽅需要Name Mangling,如namespace, class, template等等。

总的来说,Name Mangling就是⼀种规范编译器和链接器之间⽤于通信的符号表表⽰⽅法的协议,其⽬的在于按照程序的语

⾔规范,使符号具备⾜够多的语义信息以保证链接过程准确⽆误的进⾏。

Swift语⾔由于也有重载的概念,所以也有符号重载机制。

符号还原

1. C++filt

这个命令是linux下的,同时MAC也⽀持,所以在还原iOS中的C++符号,可以直接使⽤这个命令

简单参数说明如下:

NAME

c++filt - Demangle C++ and Java symbols.

SYNOPSIS

c++filt [-_|--strip-underscore]

[-n|--no-strip-underscore]

[-p|--no-params]

[-t|--types]

[-i|--no-verbo]

[-s format|--format=format]

[--help] [--version] []

其中的[-n]⽐较重要,有些的C++符号需要加上这个参数才能还原,⽐如

c++filt -n _ZN5physx2Gu24PCMMeshContactGenerationC2ERKNS_6shdfnd3aos6FloatVES6_RKNS3_12PsTransformVES9_RNS0_33MultiplePersistentContact

结果为:

physx::Gu::PCMMeshContactGeneration::PCMMeshContactGeneration(physx::shdfnd::aos::FloatV const&, physx::shdfnd::aos::FloatV const&,

physx::shdfnd::aos::PsTransformV const&, physx::shdfnd::aos::PsTransformV const&, physx::Gu::MultiplePersistentContactManifold&, physx::Gu::ContactBuffer&)

如果不加[-n]就⽆法解析;有些C++符号的解析,则不需要添加[-n]


本文发布于:2023-11-06 01:06:15,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1138014.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:符号名字
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图