Swift Name Mangling - Swift_0x01

From Brad.Cox to Chris.Lattner.

嘗試?yán)靡恍I(yè)余時(shí)間研究下 Swift栽烂,寫(xiě)一些由 OC 到 Swift 的變化啊掏。

背景

當(dāng)我使用 ClassDump 對(duì)一個(gè)項(xiàng)目操作的時(shí)候,輸出了一些看不懂的東西蟀拷。(后來(lái)知道了這是一個(gè) OC Swift 混編的工程)

#import <UIKit/UIViewController.h>
@interface _TtC11MandrakeKit11LoadingView : UIViewController {
}
- (id)initWithCoder:(id)arg1;
- (id)initWithNibName:(id)arg1 bundle:(id)arg2;
- (void)viewDidLoad;
@end

通過(guò) Reveal 分析 UI制市,我大概知道這個(gè)類(lèi)是 MandrakeKit.LoadingView,通過(guò)查看 MachO 發(fā)現(xiàn) __TEXT 段中有 __swift5_typeref暖庄,其中的數(shù)據(jù)跟這些很類(lèi)似聊替,所以這些就是Swift輸出的類(lèi)名。

Swift 這樣進(jìn)行轉(zhuǎn)換的原因是為了防止不同的庫(kù)不會(huì)出現(xiàn)命名沖突培廓。

OC & C

OC 的符號(hào)表中沒(méi)有這些復(fù)雜的符號(hào)重整惹悄,OC 使用 Selector + Type Encoding,并且OC 無(wú)重載肩钠。

C 語(yǔ)言有輕微的 Name Mangling泣港,即會(huì)將 void main(){return 0;} 符號(hào)化為:_main暂殖,增加一個(gè)下劃線(xiàn)。

OC 舉一個(gè)栗子:Point類(lèi)下的 + (id) initWithX: (int) number andY: (int) number;方法

+ (id) initWithX: (int) number andY: (int) number;
- (id) value;

_c_Point_initWithX_andY_
_i_Point_value

C++

對(duì)于如下方法当纱,C++的NameMangling會(huì)翻譯成下面這樣:

    int foo(int a) { return a * 2; }
    int foo(double a) { return a * 2.0; }
    int main() { return foo(1) + foo(1.0); }

    0000000100000f30 T __Z3food
    0000000100000f10 T __Z3fooi
    0000000100000000 T __mh_execute_header
    0000000100000f60 T _main

C++編譯器遵循一套嚴(yán)格的 mangles 規(guī)則呛每,參考這個(gè)鏈接Itanium C++ ABI documentation

int foo(double a) 為例,重整后的符號(hào)為 __Z3fooi

大致意思如下:

_ _Z 3 foo d

-   : 代表C風(fēng)格的符號(hào)
_Z  : 這個(gè)前綴標(biāo)記這個(gè)符號(hào)是一個(gè)mangled(重整)的全局C++名字
3   : 字符長(zhǎng)度坡氯,foo 這個(gè)名字晨横,有3個(gè)字符
foo : 
d   : 代表`double`,如果是 `int` 的話(huà)就是`i`

Swift

Swift 的重整規(guī)則基于 C++箫柳,也有些不同手形,包含更多的信息和概念。

栗子:

xcrun swiftc -emit-library -o test -
public class myClass{
    public func calculate(x: Int) -> Int {
        return 0;
    }
}

nm -g test
0000000000002bb0 T _$s4test7myClassC9calculate1xS2i_tF
_$s4test7myClassC9calculate1xS2i_tF

_  // 通用起始
 $s // '$s' global  // Swift 穩(wěn)定mangling版本
  4test // 字符長(zhǎng)度滞时,模塊名
  7myClass // 方法歸屬的類(lèi)名
  C // 從屬關(guān)系叁幢,myClass 是 test 模塊中的 Class
    9calculate // 字符 calculate
     1x // 參數(shù)類(lèi)型
     S2i // 堆棧中放入兩個(gè) Swift.Int
     _
       tF // 從屬關(guān)系,calculate 是 test.myClass 的 Function ???

這里解釋一下S2i坪稽,這個(gè)是從后往前取的曼玩,參數(shù)往里放是棧結(jié)構(gòu),先進(jìn)后出窒百,第一個(gè)進(jìn)棧的是參數(shù) `x:Int`  第二個(gè)是返回的參數(shù) Int黍判,所以S2i兩個(gè)`Swift.Int`。
如果入?yún)⑹?`x:String`篙梢,反參是 Int顷帖,那就變成是 `SSSi` 了。

/* 此段過(guò)期渤滞,是以前的老版本
_TFC4test7MyClass9calculatefS0_FT1xSi_Si

_T // Swift通用起始標(biāo)記
  F // Non-curried function
    C // Function of a class. (method)
      4test // 字符長(zhǎng)度贬墩,模塊名
        7MyClass // 方法歸屬的類(lèi)名
          9calculate // 函數(shù)名
            f // 非柯里化函數(shù)(Uncurried Function)
              S0 // 指定 類(lèi)實(shí)例 為類(lèi)型堆棧的第一個(gè)參數(shù)
                _FT // 參數(shù)開(kāi)始
                  1x // 第一個(gè)參數(shù)參數(shù)名
                    Si // Swift 內(nèi)置類(lèi)型 Swift.Int
                _Si // 返回類(lèi)型,同上 Swift.Int
*/

// 結(jié)果:
test.MyClass.calculate(test.MyClass) -> (x: Swift.Int) -> Swift.Int

栗子2:

 didi ~  xcrun swiftc -emit-library -o test -
public func ?? (lhs: Int, rhs: Int) -> Int {
    return 0;
}

 didi ~  nm -g test
0000000000002d60 T _$s4test004GrIh3lhs3rhsS2i_SitF

_  // 通用起始
  $s // '$s' global  // Swift 穩(wěn)定mangling版本
    4test // 符號(hào) 4是長(zhǎng)度
      004GrIh // 00 特殊字符 GrIh 就是 emoji U+1F49B
        3lhs // 參數(shù) 3是字符串長(zhǎng)度
        3rhs // 參數(shù) 3是字符串長(zhǎng)度
         S2i // 解釋參數(shù)的類(lèi)型妄呕,兩個(gè)Swift.Int
         _ // end??? 待填坑
          Si // Swift.Int
           tF // 從屬關(guān)系陶舞,?? 是 test 的 Function ???

//結(jié)果:
test.??(Swift.Int, Swift.Int) -> Swift.Int

以上

對(duì)大多數(shù)人來(lái)說(shuō),不是很多绪励。從算法的意義上講肿孵,讀取變形的名稱(chēng)是相當(dāng)簡(jiǎn)單的,但是對(duì)于人眼來(lái)說(shuō)則是不必要的困難疏魏。
這就是為什么存在拆解工具的原因停做。

補(bǔ)充

關(guān)于curried & uncurried function:
上面案例中的方法d是一個(gè)uncurried function大莫,因?yàn)閰?shù)是一個(gè)一個(gè)傳遞進(jìn)去的蛉腌,并不是當(dāng)做一個(gè)多元元組傳遞進(jìn)去的。(可能理解有誤。眉抬。)
這個(gè)概念是跟函數(shù)式編程相關(guān)的贯吓,暫未深入了解,挖個(gè)坑蜀变,稍后填坑。
ref:stackOverFlow:How is this exactly a curried function?


參考鏈接:

其他:
OS X ABI Mach-O File Format Reference

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末介评,一起剝皮案震驚了整個(gè)濱河市库北,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌们陆,老刑警劉巖寒瓦,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坪仇,居然都是意外死亡杂腰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)椅文,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)喂很,“玉大人,你說(shuō)我怎么就攤上這事皆刺∩倮保” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵羡蛾,是天一觀的道長(zhǎng)漓帅。 經(jīng)常有香客問(wèn)我,道長(zhǎng)痴怨,這世上最難降的妖魔是什么忙干? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮浪藻,結(jié)果婚禮上捐迫,老公的妹妹穿的比我還像新娘。我一直安慰自己珠移,他們只是感情好弓乙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著钧惧,像睡著了一般暇韧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浓瞪,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天懈玻,我揣著相機(jī)與錄音,去河邊找鬼乾颁。 笑死涂乌,一個(gè)胖子當(dāng)著我的面吹牛艺栈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播湾盒,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼湿右,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了罚勾?” 一聲冷哼從身側(cè)響起毅人,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尖殃,沒(méi)想到半個(gè)月后丈莺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡送丰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年缔俄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片器躏。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡俐载,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出邀桑,到底是詐尸還是另有隱情瞎疼,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布壁畸,位于F島的核電站贼急,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏捏萍。R本人自食惡果不足惜太抓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望令杈。 院中可真熱鬧走敌,春花似錦、人聲如沸逗噩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)异雁。三九已至捶障,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纲刀,已是汗流浹背项炼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锭部。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓暂论,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拌禾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子取胎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容