_attribute_(weak)的用法

使用HiSilicon做項目,在系統客制初始化service init 中有定義瞭如下的函數:

HI_S32 _attribute_((weak)) HI_HAL_Service_PreInit(HI_VOID)

{

    return HI_SUCCESS;

}

遂找到如下文章,解釋很清楚;

我們不確定外部模塊是否提供一個函數func,但是我們不得不用這個函數,即自己模塊的代碼必須用到func函數:

extern int func(void);

...................

int a = func();

if( a > .....)

{

..........

}

............

我們不知道func函數是否被定義了

這會導致2個結果:

1:外部存在這個函數func,並且EXPORT_SYMBOL(func),那麼在我自己的模塊使用這個函數func,正確。

2:外部其實不存在這個函數,那麼我們使用func,程序直接崩潰。


所以這個時候,__attribute__((weak)) 派上了用場。

在自己的模塊中定義:

int  __attribute__((weak))  func(......)

{

return 0;

}


將本模塊的func轉成弱符號類型,如果遇到強符號類型(即外部模塊定義了func),那麼我們在本模塊執行的func將會是外部模塊定義的func。

如果外部模塊沒有定義,那麼,將會調用這個弱符號,也就是在本地定義的func,直接返回了一個1(返回值視具體情況而定)

相當於增加了一個默認函數。

原理:連接器發現同時存在弱符號和強符號,優先選擇強符號,如果發現不存在強符號,只存在弱符號,則選擇弱符號。如果都不存在:靜態鏈接,恭喜,編譯時報錯;動態鏈接,對不起,系統無法啓動。


轉載出處:http://blog.chinaunix.net/uid-7828352-id-4477460.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章