__attribute__((weak)) 逃离我推掉我的手 2022-08-07 16:54 146阅读 0赞 ** \_\_attribute\_\_((weak))** 情况是这样的,碰到一个棘手的问题:我们不确定外部模块是否提供一个函数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(返回值视具体情况而定) 相当于增加了一个默认函数。 原理:连接器发现同时存在弱符号和强符号,有限选择强符号,如果发现不存在强符号,只存在弱符号,则选择弱符号。如果都不存在:静态链接,恭喜,编译时报错,动态链接:对不起,系统无法启动。
还没有评论,来说两句吧...