例一:
//weak.c
#include <stdio.h>
void symbol1()
{
printf("%s\n",__FUNCTION__);
}
//symbol222.c
void symbol222()
{
printf("%s\n",__FUNCTION__);
}
//void symbol1() __attribute__ ((weak,alias("symbol222"))); //这一包与下面的asm()一句是等效的。
int main()
{
asm(".weak symbol1\n\t .set symbol1, symbol222\n\t");
symbol1();
return 0;
}
gcc weak.c symbol222.c -o weak
./weak
输出结果:symbol1。
当没有定义symbol1时,就使用symbol222来代替symbol1.
例二:
//weak2.c
#include <stdio.h>
extern void symbol1() __attribute__((weak));
void symbol1()
{
printf("%s.%s\n",__FILE__,__FUNCTION__);
}
int main()
{
//asm(".weak symbol1\n\t .set symbol1, symbol222\n\t");
symbol1();
return 0;
}
//strong.c
#include <stdio.h>
void symbol1()
{
printf("%s.%s\n",__FILE__,__FUNCTION__);
}
编译如下:
liudan@liudan-desktop:~/weak$ gcc weak2.c -o weakstrong
liudan@liudan-desktop:~/weak$ ./weakstrong
输出结果:weak2.c.symbol1
liudan@liudan-desktop:~/weak$ gcc weak2.c strong.c -o weakstrong
liudan@liudan-desktop:~/weak$ ./weakstrong
输出结果:strong.c.symbol1
当有两个函数同名时,则使用强符号(也叫全局符号)来代替弱符号。
这只是告诉大家weak和weak alias的用法。其中还有更深的编译原理。不过我还没有学习得更深。等学会了,再发出来吧。