C语言的__weak int timer_init(void)中__attribute__((weak))
当一个工程足够大时,我们并不确认外部模块是否提供了一个我们想要的函数func,但是我们自己的模块又必须用到这个func函数,于是导致:
1.外部模块存在func,且EXPORT_SYMBOL(func),那么我们在自己的模块中使用这个func,正确。
2.外部模块不存在这个func,使用的话则程序崩溃。
这个时候就需要weak属性了。
int __attribute__((weak)) func()
{
return 0;
}
将模块的func转换成符号类型,如果遇到了强符号类型(即外部定义了func),那么我们在本模块执行的func将会是外部定义的。
如果外部没有定义,将会调用这个弱符号,即本地定义的func。
原理:链接器发现同时存在弱符号和强符号,优先选择强符号,如果发现不存在强符号,只存在弱符号,则选择弱符号;如果都不存在则
1.静态链接,编译报错;
2.动态链接,无法启动;
注意:weak属性只在静态库(.o,.a)中生效,在动态库(.so)中无效。