ZHCUAV8W january 1998 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , OMAP-L132 , OMAP-L137 , OMAP-L138 , SM470R1B1M-HT , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
每個(gè)外部可見(jiàn)的標(biāo)識(shí)符都會(huì)分配一個(gè)用于目標(biāo)文件的唯一符號(hào)名,即所謂的鏈接名。該名稱(chēng)由編譯器根據(jù)一種算法分配,該算法取決于符號(hào)的名稱(chēng)、類(lèi)型和源語(yǔ)言。該算法可能會(huì)向標(biāo)識(shí)符添加前綴(通常是下劃線),并且可能會(huì)改編 名稱(chēng)。
用戶定義的符號(hào)(使用 C 代碼和匯編代碼)存儲(chǔ)在同一個(gè)命名空間中,這意味著需要確保 C 標(biāo)識(shí)符不與匯編代碼標(biāo)識(shí)符相沖突。標(biāo)識(shí)符可能與匯編關(guān)鍵字(例如寄存器名稱(chēng))相沖突;在這種情況下,編譯器會(huì)自動(dòng)使用轉(zhuǎn)義序列來(lái)防止沖突。編譯器使用雙平行線對(duì)標(biāo)識(shí)符進(jìn)行轉(zhuǎn)義,這指示匯編器不要將標(biāo)識(shí)符視為關(guān)鍵字。需要確保 C 標(biāo)識(shí)符不與用戶定義的匯編代碼標(biāo)識(shí)符相沖突。
名稱(chēng)改編會(huì)對(duì)函數(shù)鏈接名中函數(shù)參數(shù)的類(lèi)型進(jìn)行編碼,僅發(fā)生在未聲明為 extern "C" 的 C++ 函數(shù)中。改編會(huì)實(shí)現(xiàn)函數(shù)重載、運(yùn)算符重載和類(lèi)型安全鏈接。請(qǐng)注意,函數(shù)的返回值未在改編后的名稱(chēng)中編碼,因?yàn)闊o(wú)法根據(jù)返回值重載 C++ 函數(shù)。
例如,名為 func 的 32 位函數(shù)的 C++ 鏈接名的一般形式如下:
__func__F parmcodes
其中,parmcodes 是對(duì) func 參數(shù)類(lèi)型進(jìn)行編碼的字母序列。
對(duì)于這個(gè)簡(jiǎn)單的 C++ 源文件:
int foo(int I){ } //global C++ function compiled in 16-bit mode生成的匯編代碼如下:
$__foo__Fifoo 的鏈接名是 $__foo__Fi,表示 foo 是一個(gè)僅接受整數(shù)類(lèi)型參數(shù)的 16 位函數(shù)。為了幫助檢查和調(diào)試,提供了一個(gè)名稱(chēng)還原實(shí)用程序,可將名稱(chēng)還原為 C++ 源代碼中的名稱(chēng)。請(qǐng)參閱Chapter344,了解詳情。
改編算法遵循 Itanium C++ ABI (http://www.codesourcery.com/cxx-abi/abi.html) 中的描述。
int foo(int i) { } 將改編為 _Z3fooi