一般來說,這個關鍵字使用在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 |