5.2.2 移植總結
對于C/C++為代表的編譯型語言來說,移植方法一般包括兩種,也就是源代碼修改和編譯選項修改,有時候使用其中一種方式,有時候兩種方式需要同時使用。
1.源代碼修改
對于源代碼修改的場景,主要分為以下幾種:
1)對內嵌的匯編指令的修改
正如在5.1節介紹的那樣,x86架構和鯤鵬在匯編指令上完全不同,對于在編譯型語言中內嵌的匯編指令,需要根據目標架構指令集的具體情況進行有針對性更改。
2)char數據類型的修改
使用5.2.1節介紹的方法,把char數據類型更改為signed char。
3)雙精度浮點型轉整型溢出處理的修改
詳細見5.2.3節內容。
2.編譯選項修改
1)char數據類型默認無符號
對于char數據類型默認無符號問題,除了上面介紹的直接更改代碼方法外,還可以使用修改編譯選項來解決,就是在編譯時指定-fsigned-char選項,這一點在5.2.1節也演示了。當然,如果是從鯤鵬架構移植到x86架構,可以使用-funsigned-char來保持char類型為無符號型。
2)指定編譯64位應用
在指定應用編譯為64位時,x86架構下需要指定編譯選項-m64,但是在鯤鵬架構下不支持這個選項,替代的選擇是-mabi=lp64。需要注意的是,不是所有的gcc版本都支持-mabi=lp64選項,只有在4.9.4及以后的版本才支持。
3)目標指令集
在執行編譯時,可以指定目標的指令集,使用的是-march編譯選項,該選項可以指定的指令集類型非常多,大概有幾十種,但是鯤鵬架構目前只對應一種類型,就是ARMv8-a,在編譯時可以指定編譯選項為-march=ARMv8-a。
4)編譯宏
gcc預先內置了各種宏定義,這些宏定義有一部分是和架構有關系的,同時,gcc也支持自定義宏,在代碼里,也可以通過宏來對不同的架構做區別處理,例如,同樣一段功能,通過宏定義的控制條件來區分不同架構下的實現方式,這樣在編譯時指定宏定義,就可以在同一個代碼文件下適配多種架構。