記一次 mangle & demangle 之旅

今晚閱讀 objc 的源碼時(shí),看到一個(gè)很長(zhǎng)很長(zhǎng)的符號(hào):

__ZN4objc8DenseMapIP11objc_objectmLb1ENS_12DenseMapInfoIS2_EENS3_ImEEE16FindAndConstructERKS2_

這是什么鬼???

反匯編了那么多的 APP,怎么從來(lái)沒有見過這么變態(tài)的名字?

蘋果的開發(fā)人員是有多么變態(tài)?

很快,我注意到這個(gè)符號(hào)里面有些數(shù)字。之前閱讀 Swift 源碼時(shí),看到過類似的情況。在大腦的記憶中搜索了一遍,得出了一個(gè)關(guān)鍵字 demangle。

mangle 的中文含義是“破壞,撕裂”。Swift 在編譯過程中,會(huì)破壞原來(lái)的格式,變?yōu)橐环N不利于人類閱讀的格式。該過程即為“mangle”。

demangle 的中文含義是“解構(gòu),還原函數(shù)”。把不利于閱讀的符號(hào)轉(zhuǎn)為利于人類閱讀的符號(hào),即為“demangle”。

比如,在 Swift 中,SwiftClassExample.myClass 編譯后的符號(hào)為 _TtC17SwiftClassExample7myClass(根據(jù) Swift 版本的不同,可能會(huì)有變化)。

下面,我們嘗試用以下命令進(jìn)行驗(yàn)證:


> xcrun swift-demangle --compact _TtC17SwiftClassExample7myClass
> SwiftClassExample.myClass

很明顯,我們可以把 Swift 編譯后的符號(hào)轉(zhuǎn)為正常的可讀格式。

回到之前的 objc 上面,__ZN4objc8DenseMapIP11objc_objectmLb1ENS_12DenseMapInfoIS2_EENS3_ImEEE16FindAndConstructERKS2_是不是被 mangle 的符號(hào)呢?

嘗試以“demangle 函數(shù)名” 為關(guān)鍵字進(jìn)行搜索。搜索結(jié)果如下所示:

demangle 函數(shù)名

通過查看第一個(gè)結(jié)果 如何識(shí)別C++編譯以后的函數(shù)名(demangle) ,我們可以得出,這個(gè)符號(hào)是 c++ mangle 后的符號(hào)。

同時(shí),文中提到linux下有一個(gè)工具可以幫助我們demangle。

下面,我們嘗試用c++filt命令進(jìn)行驗(yàn)證:

> c++filt __ZN4objc8DenseMapIP11objc_objectmLb1ENS_12DenseMapInfoIS2_EENS3_ImEEE16FindAndConstructERKS2_
> objc::DenseMap<objc_object*, unsigned long, true, objc::DenseMapInfo<objc_object*>, objc::DenseMapInfo<unsigned long> >::FindAndConstruct(objc_object* const&)

很明顯,這個(gè)符號(hào)是 c++ 編譯后的符號(hào)。

至此,本次探索之旅也到此結(jié)束。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,620評(píng)論 4 61
  • 七八春秋,誰(shuí)不念,蘆溝曉月?中原地,刀光劍影,鐵蹄猖獗。永定河畔煙與火,金陵城內(nèi)尸和血。憶當(dāng)初,多少好男兒,沖冠發(fā)...
    北方北葵閱讀 314評(píng)論 0 3
  • 文 / 西門君 圖 / 網(wǎng)絡(luò) 1. 標(biāo)題里的這句話,是一個(gè)叫做小蔓的女孩親口對(duì)我說(shuō)的。 她是一個(gè)活力四射的女孩子,...
    西門君不吐槽閱讀 799評(píng)論 0 0

友情鏈接更多精彩內(nèi)容