匯編的WEAK關鍵字


一般來說,這個關鍵字使用在IMPORT和EXPORT這兩個聲明段。

////////////////////////////////////////////////////////////////////////////
//VectorsTrampolines.s
////////////////////////////////////////////////////////////////////////////
IMPORT     StackTop [WEAK]

 AREA |.text|, CODE, READONLY 
;Vector list
ARM_Vectors
   DCD     StackTop

 IMORT:   如果我們有一個名為ARM_Vectors的量表,向量表的第一個數值指向一個StackTop函數的地址。因為我們可能定義了該函數,也可能沒有,為了代碼的簡便,我們可以使用WEAK關鍵字。

當我們定義了StackTop函數后,那么ARM_Vectors里第一個向量值就是StackTop函數的地址。如果沒有定義StackTop,那么編譯器不會報錯,而這時候第一個向量值就直接賦予0。

EXPORT:EXPORT的函數帶有WEAK標志的話,並且別的源代碼沒有定義同名函數,那么連接時就是該函數;否則,就是另外的一個同名函數(類似類的繼承)

eg:

////////////////////////////////////////////////////////////////////////////
//VectorsTrampolines.s
////////////////////////////////////////////////////////////////////////////
 IMPORT     StackTop 
 AREA |.text|, CODE, READONLY 
;Vector list
ARM_Vectors
   DCD     StackTop


////////////////////////////////////////////////////////////////////////////
//VectorsHandlers.s
////////////////////////////////////////////////////////////////////////////
EXPORT  StackTop               [WEAK]
 AREA    |i.DefaultHandler|, CODE, READONLY
StackTop     PROC                
                B       .
                ENDP

////////////////////////////////////////////////////////////////////////////
//Func.c
////////////////////////////////////////////////////////////////////////////
Extern “C” StackTop()
{}

    因為VectorsHandlers.s的StackTop是用WEAK導出的,而Func.c又有同名的函數,那么這時候VectorsTrampolines.s里的StackTop是連接Func.c里定義的StackTop。

 

很有意思的問題,如果EXPORT和IMPORT都用WEAK聲明,如:

////////////////////////////////////////////////////////////////////////////
//VectorsTrampolines.s
////////////////////////////////////////////////////////////////////////////
 IMPORT     StackTop  [WEAK]
 AREA |.text|, CODE, READONLY 
;Vector list
ARM_Vectors
   DCD     StackTop


////////////////////////////////////////////////////////////////////////////
//VectorsHandlers.s
////////////////////////////////////////////////////////////////////////////
EXPORT  StackTop               [WEAK]
 AREA    |i.DefaultHandler|, CODE, READONLY
StackTop     PROC                
                B       .
                ENDP

 這時候VectorsTrampolines.s里的ARM_Vectors的第一個向量值是什么呢?還是VectorsHandlers.s里的StackTop函數地址么?很遺憾,不是,而直接是0!所以這點就注意了,最好不要對同名的函數在IMPORT和EXPORT時都使用WEAK,否則結果很可能讓你抓狂!

總結:

Vectors Trampolines.s VectorsHandlers.s Func.c ARM_Vectors第一個向量值
IMPORT     StackTop  [WEAK]

0
IMPORT     StackTop  [WEAK] EXPORT  StackTop VectorsHandlers.s的StackTop地址
IMPORT     StackTop EXPORT  StackTop              [WEAK] 有同名的StackTop函數 Func.c的StackTop地址
IMPORT     StackTop EXPORT  StackTop      有同名的StackTop函數 存在兩個StackTop,編譯出錯
IMPORT     StackTop  [WEAK] EXPORT  StackTop              [WEAK] 0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM