__attribute__ 之weak,alias屬性

//strong.c

#include <stdio.h>

void symbol1()
{
    printf("%s.%s\n",__FILE__,__FUNCTION__);
}
//weak.c

#include <stdio.h>
void symbol1() __attribute__ ((weak,alias("symbol222")));
//void symbol1() __attribute__ ((weak));
void symbol222()
{
    printf("%s.%s\n",__FILE__,__FUNCTION__);
}

int main()
{
    //asm(".weak symbol1\n\t .set symbol1, symbol222\n\t");
    if(symbol1)
 symbol1();
    return 0;
}
////////////////////////////////////////
//gcc weak.c strong.c -o weak
//./weak
//輸出:strong.c.symbol1
////////////////////////////////////////
//gcc weak.c -o weak
//./weak
//輸出:weak.c.symbol222
////////////////////////////////////////
//總結weak屬性
//(1)asm(".weak symbol1\n\t .set symbol1, symbol222\n\t");與
//     void symbol1() __attribute__ ((weak,alias("symbol222")));等效。
//(2)給函數加上weak屬性時,即使函數沒定義,函數被調用也可以編譯成功。
//(3)當有兩個函數同名時,則使用強符號(也叫全局符號,即沒有加weak的函數)來代替弱符號(加weak的函數)。
//(4)當函數沒有定義,但如果是“某個函數”的別名時,如果該函數被調用,就間接調用“某個函數”。

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