今晚閱讀 objc 的源碼時,看到一個很長很長的符號:
__ZN4objc8DenseMapIP11objc_objectmLb1ENS_12DenseMapInfoIS2_EENS3_ImEEE16FindAndConstructERKS2_
這是什么鬼搀矫??棚壁?
反匯編了那么多的 APP,怎么從來沒有見過這么變態(tài)的名字项炼?
蘋果的開發(fā)人員是有多么變態(tài)揭厚?
很快但绕,我注意到這個符號里面有些數(shù)字救崔。之前閱讀 Swift 源碼時,看到過類似的情況捏顺。在大腦的記憶中搜索了一遍六孵,得出了一個關(guān)鍵字 demangle。
mangle 的中文含義是“破壞幅骄,撕裂”劫窒。Swift 在編譯過程中,會破壞原來的格式拆座,變?yōu)橐环N不利于人類閱讀的格式主巍。該過程即為“mangle”。
demangle 的中文含義是“解構(gòu)挪凑,還原函數(shù)”孕索。把不利于閱讀的符號轉(zhuǎn)為利于人類閱讀的符號,即為“demangle”岖赋。
比如檬果,在 Swift 中,SwiftClassExample.myClass
編譯后的符號為 _TtC17SwiftClassExample7myClass
(根據(jù) Swift 版本的不同唐断,可能會有變化)。
下面杭抠,我們嘗試用以下命令進行驗證:
> xcrun swift-demangle --compact _TtC17SwiftClassExample7myClass
> SwiftClassExample.myClass
很明顯脸甘,我們可以把 Swift 編譯后的符號轉(zhuǎn)為正常的可讀格式。
回到之前的 objc 上面偏灿,__ZN4objc8DenseMapIP11objc_objectmLb1ENS_12DenseMapInfoIS2_EENS3_ImEEE16FindAndConstructERKS2_
是不是被 mangle
的符號呢丹诀?
嘗試以“demangle 函數(shù)名” 為關(guān)鍵字進行搜索。搜索結(jié)果如下所示:
通過查看第一個結(jié)果 如何識別C++編譯以后的函數(shù)名(demangle) ,我們可以得出铆遭,這個符號是 c++ mangle
后的符號硝桩。
同時,文中提到linux下有一個工具可以幫助我們demangle
枚荣。
下面碗脊,我們嘗試用c++filt
命令進行驗證:
> 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&)
很明顯,這個符號是 c++ 編譯后的符號橄妆。
至此衙伶,本次探索之旅也到此結(jié)束。