前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >为什么 demangle 会失败?

为什么 demangle 会失败?

作者头像
酷酷的哀殿
发布于 2020-10-26 07:19:14
发布于 2020-10-26 07:19:14
1.3K00
代码可运行
举报
文章被收录于专栏:酷酷的哀殿酷酷的哀殿
运行总次数:0
代码可运行

本周有位网友在交流群提到“为什么无法在自己的电脑中通过 c++filt 解析符号 _ZN5folly6detail15str_to_integralIxEENS_8ExpectedIT_NS_14ConversionCodeEEEPNS_5RangeIPKcEE ?”

name mangle

在解释上面的问题前,我们先了解一下什么是 name mangle?

根据 wikipedia 的定义, name mangle 是现代计算机程序设计语言的编译器用于解决由于程序实体的名字必须唯一而导致的问题的一种技术。

上面的话术比较晦涩难懂,我们下面用具体的示例说明一下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// A 文件class Hi {public:    void sayHi(int) {    }    void sayHi(int, char){    }};// B 文件Hi test =  Hi::instance();test.sayHi(1);test.sayHi(1, 'c');

A 文件声明了类 Hi ,B 文件分别调用调用 Hi 两个方法 void sayHi(int)void sayHi(int, char)

如果像 c 语言一样的方式生成符号,则会导致同时存在两个相同的强符号 _sayHi 。A 文件会因为同一个符合定义两次导致编译失败。B 文件因为无法找到合适的链接符号导致编译失败。

为此,编译器会很聪明的帮我们做一些事情。通过分别将两个方法进行了一次符合映射操作。该符合映射操作可以将符合转化为相对独特的唯一字符串,解决无法编译的问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// gcc 标准Hi::sayHi(int)          →   _ZN2Hi5sayHiEiHi::sayHi(int, char)    →   _ZN2Hi5sayHiEic

通常,我们将“通过特殊规则将符合映射为相对独特的唯一字符串”称之为 mangle ,相对的,反向操作被称之为 demangle

注意:mangle 后仍然存在冲突的可能性

name mangle 的各类方言

因为各种历史原因, mangle 目前没有制定任何的官方标准。在这种情况下,每个编译器都会自行定义一套“方言”,甚至同一套编译器的不同版本也会可能采用不同的规则。

如下,Wikipedia 中总结了一份不同编译的对相同函数进行 mangle 的示例。

https://zh.wikipedia.org/wiki/%E5%90%8D%E5%AD%97%E4%BF%AE%E9%A5%B0

编译器

void h(int)

void h(int, char)

void h(void)

Intel C++ 8.0 for Linux

_Z1hi

_Z1hic

_Z1hv

HP aC++ A.05.55 IA-64

_Z1hi

_Z1hic

_Z1hv

IAR EWARM C++ 5.4 ARM

_Z1hi

_Z1hic

_Z1hv

GCC 3.x and 4.x

_Z1hi

_Z1hic

_Z1hv

GCC 2.9x

h__Fi

h__Fic

h__Fv

HP aC++ A.03.45 PA-RISC

h__Fi

h__Fic

h__Fv

Microsoft Visual C++ v6-v10

?h@@YAXH@Z

?h@@YAXHD@Z

?h@@YAXXZ

Digital Mars C++

?h@@YAXH@Z

?h@@YAXHD@Z

?h@@YAXXZ

Borland C++ v3.1

@h$qi

@h$qizc

@h$qv

OpenVMS C++ V6.5 (ARM模式)

H__XI

H__XIC

H__XV

OpenVMS C++ V6.5 (ANSI模式)

CXX$__7H__FI0ARG51T

CXX$__7H__FIC26CDH77

CXX$__7H__FV2CB06E8

OpenVMS C++ X7.1 IA-64

CXX$_Z1HI2DSQ26A

CXX$_Z1HIC2NP3LI4

CXX$_Z1HV0BCA19V

SunPro CC

__1cBh6Fi_v_

__1cBh6Fic_v_

__1cBh6F_v_

Tru64 C++ V6.5 (ARM模式)

h__Xi

h__Xic

h__Xv

Tru64 C++ V6.5 (ANSI模式)

__7h__Fi

__7h__Fic

__7h__Fv

Watcom C++ 10.6

W?h$n(i)v

W?h$n(ia)v

W?h$n()v

c++filt

在了解 name mangle 具有不同的“方言”后,很容易就猜测到“demangle 失败的原因可能是不同版本的 c++filt 工具存在不同解析方式”。

经过测试,笔者电脑中的 c++filt 可以正常进行对符号进行 demangle 操作。

通过 which 命令,我们对比一下两台电脑中 c++filt 的区别。

在 demangle 失败的电脑中,c++filt 命令对应执行文件是 /usr/bin/c++filt 。

而在笔者的电脑中,c++filt 命令对应执行文件是 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++filt 。

很明显,对于 iOS 开发者,我们应该选择 Xcode 工具自带的 c++filt 才更加合适

总结

本文介绍了 name mangle 存在不同的版本,同时, c++filt 工具也存在不同的版本,两者必须互相匹配才能正常进行 name mangle/demangle 操作。

点击阅读原文,可以查看作者的另外一篇文章 llvm name mangle 学习笔记

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 酷酷的哀殿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
救命!单体系统升级微服务,数据一致性要 “炸锅” 了!快来看解决方案
在数字化浪潮的席卷下,企业的业务发展日新月异,传统的单体系统逐渐难以满足日益增长的业务需求。越来越多的企业选择向微服务架构迁移,期望借此提升系统的灵活性和可扩展性,跟上业务发展的快节奏。然而,迁移之路并非一帆风顺,其中数据一致性问题犹如拦路虎,让不少企业头疼不已。一旦数据出现不一致,业务流程就会乱套,用户体验直线下降,严重时甚至会导致巨额经济损失。那么,如何才能在迁移过程中有效保障数据的一致性呢?别着急,接下来就为你揭开谜底!
lyb-geek
2025/03/21
1100
救命!单体系统升级微服务,数据一致性要 “炸锅” 了!快来看解决方案
微服务架构下的数据一致性保证(一)
大家好,今天我给大家分享的题目是微服务架构下的数据一致性保证。 今天分享第一篇,主要内容包括: 1.传统使用本地事务和分布式事务保证一致性。 2.传统分布式事务不是微服务中一致性的最佳选择。 3.微
yuanyi928
2018/04/02
1.4K0
微服务架构下的数据一致性保证(一)
保证分布式系统数据一致性的6种方案
在电商等业务中,系统一般由多个独立的服务组成,如何解决分布式调用时候数据的一致性? 具体业务场景如下,比如一个业务操作,如果同时调用服务 A、B、C,需要满足要么同时成功;要么同时失败。A、B、C 可能是多个不同部门开发、部署在不同服务器上的远程服务。 在分布式系统来说,如果不想牺牲一致性,CAP 理论告诉我们只能放弃可用性,这显然不能接受。为了便于讨论问题,先简单介绍下数据一致性的基础理论。 强一致 当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。这种是对用户最友好的,就是用户
程序员鹏磊
2018/02/09
16.1K0
保证分布式系统数据一致性的6种方案
微服务架构下的数据一致性保证(三):补偿模式
大家好 今天分享的还是关于微服务架构下的数据一致性保证的话题,是数据一致性系列分享的第三篇。 在第一篇分享中介绍了微服务架构应满足数据最终一致性,并简要介绍了最终一致性的三种模式:可靠事件模式、补偿模
yuanyi928
2018/04/02
2.1K0
微服务架构下的数据一致性保证(三):补偿模式
业务中台数据一致性方案
随着业务的发展,微服务架构逐渐成为当下业务中台的主流架构形式,它不但解决了各个应用之间的解耦问题,同时也解决了单体应用的性能问题实现可扩展可动态伸缩的能力。如下图所示,业务中台就是将平台的通用能力进行下沉,避免重复建设,形成底座平台能力,上层的各个应用服务都是基于中台能力进行快速构建。但是随着应用规模的扩大,原本在单体应用中不是问题的问题,在微服务架构中可能就是比较严重的问题,本文所要探讨的服务之间的数据一致性便是其中最具代表性的问题。本文将结合常见的电商下单场景来说明业务中台数据一致性方案。
慕枫技术笔记
2023/03/20
3870
业务中台数据一致性方案
有态服务数据一致性难题,如何破局?
在有态服务中,常常会涉及到多个节点或数据库的操作。以电商系统为例,当用户下单时,这一简单的操作背后其实涉及到多个关键环节,包括库存系统的库存扣减和订单系统的订单记录。如果这些操作不能保持一致,就会出现订单生成了但库存未扣减,或者库存扣减了但订单却没有生成的尴尬局面。这时,分布式事务就派上了用场。它就像是一位严谨的 “指挥官”,确保所有相关操作要么全部成功提交,让整个业务流程顺利完成;要么全部回滚,就像什么都没有发生过一样,从而避免出现数据不一致的情况,保障业务的正常运转。
lyb-geek
2025/03/17
1070
有态服务数据一致性难题,如何破局?
微服务数据一致性的演进:SAGA,CQRS,Event Sourcing的由来和局限
原题:Data consistency in microservices architecture
yuanyi928
2018/11/30
2.5K0
微服务数据一致性的演进:SAGA,CQRS,Event Sourcing的由来和局限
分布式系统的数据一致性问题,你是如何解决的
1、一致性概念: 指分布式服务系统之间的弱一致性,包括应用系统的一致性和数据的一致性. 数据量大,高并发要求高,强计算能力,响应速度要求快,等的互联网要求场景下,服务节点开始池化,开始出现容器应用和数据拆分,分而治之的思想和逻辑 水平拆分和垂直拆分
友儿
2022/09/11
6500
MQ 如何保证数据一致性?
上个月,我们有个电商系统出了个灵异事件:用户支付成功了,但订单状态死活不改成“已发货”。
苏三说技术
2025/03/27
1530
跨系统数据一致性方案的思考(上)
本文主要意在总结沉淀现有问题解决经验过程,整理解决跨系统数据不一致问题的经验方法。
架构精进之路
2020/08/17
2.1K0
跨系统数据一致性方案的思考(上)
微服务架构下的数据一致性:可靠事件模式
在《微服务架构下的数据一致性:概念及相关模式》中介绍了在微服务中实现数据一致性的三种方式,包括可靠事件模式、业务补偿模式、TCC模式。本文重点说一下可靠事件投递。
程序猿小亮
2021/01/28
1.1K0
「微服务架构」微服务架构中的数据一致性
在微服务中,一个逻辑上原子操作可以经常跨越多个微服务。即使是单片系统也可能使用多个数据库或消息传递解决方案。使用多个独立的数据存储解决方案,如果其中一个分布式流程参与者出现故障,我们就会面临数据不一致的风险 - 例如在未下订单的情况下向客户收费或未通知客户订单成功。在本文中,我想分享一些我为使微服务之间的数据最终保持一致而学到的技术。
架构师研究会
2019/05/06
1.1K0
「微服务架构」微服务架构中的数据一致性
跨系统数据一致性问题解决方案汇总
目前随着微服务化建设的普及,存在越来越多的跨系统数据交互情况,跨系统数据一致性问题越发凸显,那如何有效保证跨系统数据的一致性呢?
架构精进之路
2022/09/27
1.9K0
跨系统数据一致性问题解决方案汇总
微服务架构-实现技术之三大关键要素2数据一致性:分布式事物+CAP&BASE+可靠事件模式+补偿模式+Sagas模式+TCC模式+最大努力通知模式+人工干预模式
传统单体应用一般都会使用一个关系型数据库,好处是使用ACID事务特性,保证数据一致性只需要开启一个事务,然后执行更新操作,最后提交事务或回滚事务。更方便的是可以以借助于Spring等数据访问技术和框架后只需要关注引起数据改变的业务本身即可。
全栈程序员站长
2022/08/10
5990
微服务架构-实现技术之三大关键要素2数据一致性:分布式事物+CAP&BASE+可靠事件模式+补偿模式+Sagas模式+TCC模式+最大努力通知模式+人工干预模式
如何保障微服务架构下的数据一致性?
随着微服务架构的推广,越来越多的公司采用微服务架构来构建自己的业务平台。就像前边的文章说的,微服务架构为业务开发带来了诸多好处的同时,例如单一职责、独立开发部署、功能复用和系统容错等等,也带来一些问题。
lyb-geek
2019/07/09
2.1K0
如何保障微服务架构下的数据一致性?
浅谈数据一致性
互联网的工程开发,与传统软件相比,往往要面临非常复杂多变的业务场景,这是老生常谈的问题了。虽然在工程开发与协同领域已经有了比较多的实践案例,但对于比较底层的一些技术框架的协同,由于选型的原因,往往是比较多元化的,这也就导致了一些基础框架之间的协同会出现一些问题。
木东居士
2020/11/03
1.3K0
跨系统数据一致性问题经验实战
目前随着微服务化建设的普及,存在越来越多的跨系统数据交互情况,跨系统数据一致性问题越发凸显,那如何有效保证跨系统数据的一致性呢? 本文旨在总结沉淀工作中问题的解决经验,整理解决跨系统数据不一致问题的经验方法。 ◆1、为什么会有跨系统数据一致性问题? 提到数据一致性,我们很容易想到的就是数据库中的事务操作。 事务的原子性和持久性可以确保在一个事务内,操作多条数据,要么都成功,要么都失败。这样在一个系统内部,我们可以很自然地使用数据库事务来保证数据一致性。但是在微服务的今天,一项操作会涉及到跨多个系统多个数据库
IT大咖说
2022/05/17
1.2K0
跨系统数据一致性问题经验实战
Java微服务下的分布式事务介绍及其解决方案
2 用户支付完成会将支付状态及订单状态保存在订单数据库中,由订单服务去维护订单数据库。而学生选课信息在学习中心数据库,由学习服务去维护学习中心数据库的信息。下图是系统结构图:
全栈程序员站长
2022/07/01
4330
Java微服务下的分布式事务介绍及其解决方案
使用消息系统进行微服务间通讯时,如何保证数据一致性
前言 微服务是当下的热门话题,今天来聊下微服务中的一个敏感话题:如何保证微服务的数据一致性。谈到分布式事务,就避免不了CAP理论。 CAP理论是指对于一个分布式计算系统来说,不可能同时满足以下三点:
yuanyi928
2018/04/02
1K0
使用消息系统进行微服务间通讯时,如何保证数据一致性
微服务场景下的数据一致性解决方案 - saga
数据一致性是构建业务系统需要考虑的重要问题 , 以往我们是依靠数据库来保证数据的一致性。但是在微服务架构以及分布式环境下实现数据一致性是一个很有挑战的的问题。ServiceComb作为开源的微服务框架致力解决微服务开发过程中的问题。我们最近发起的ServiceComb-Saga项目来解决分布式环境下的数据最终一致性问题。本文将向大家介绍为什么数据一致性如此重要?Saga又是什么?
句幽
2020/07/21
1.1K0
推荐阅读
相关推荐
救命!单体系统升级微服务,数据一致性要 “炸锅” 了!快来看解决方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档