ARM 彙編中的 WEAK含義
好多次看到這個WEAK,不知道什麼意思,到網上查了,才知道即使是沒有定義也不報錯的意思。
引用ARM官網的一段話:
.8.9. IMPORT 和 EXTERN
這些指令為組譯工具提供一個未在當前彙編中定義的名稱。
IMPORT 將匯入名稱,不管該名稱在當前彙編中是否被引用。
EXTERN 僅匯入在當前彙編中引用的名稱。
文法
IMPORT symbol {[attr}]}
IMPORT symbol [WEAK{,attr}]
EXTERN symbol {[attr}]}
EXTERN symbol [WEAK{,attr}]
其中:
-
symbol
-
是在單獨彙編的源檔案、目標檔案或庫中定義的一個符號名稱。 符號名區分大小寫。
-
WEAK
-
防止連結器在符號未在其他地方定義時產生錯誤訊息。 同時防止連結器搜尋還未包含的庫。
-
attr
-
是下列項之一:
-
DYNAMIC
-
當原始碼連結到動態組件中時,symbol 對於其他組件是可見的。
-
PROTECTED
-
當原始碼連結到動態組件中時,symbol 對於其他組件是可見的,但是不能由其他組件重新定義。
-
HIDDEN
-
當原始碼連結到動態組件中時,symbol 對於其他組件是不可見的。
用法
在連結時,名稱被解析為在其他目標檔案中定義的符號。 該符號被當作程式地址。 如果未指定 [WEAK] 且在連結時沒有找到相應的符號,則連結器會產生錯誤。
如果指定了 [WEAK] 且在連結時沒有找到相應的符號:
樣本
此樣本測試是否已連結 C++ 庫,並根據結果執行條件跳轉。
AREA Example, CODE, READONLY EXTERN __CPP_INITIALIZE[WEAK] ; If C++ library linked, gets the address of ; __CPP_INITIALIZE function. LDR r0,=__CPP_INITIALIZE ; If not linked, address is zeroed. CMP r0,#0 ; Test if zero. BEQ nocplusplus ; Branch on the result.
來自http://infocenter.arm.com/help/?topic=/com.arm.doc.dui0204hc/Babcjehh.html