//strong.c

#include

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

#include
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)当函数没有定义,但如果是“某个函数”的别名时,如果该函数被调用,就间接调用“某个函数”。
来源:https://blog.csdn.net/myxmu/article/details/9466417 如侵删