将外部函数声明为弱引用(GCC)

将外部函数声明为弱引用(GCC)

Content #

在GCC中,我们可以通过使用“_attribute_((weakref))”这个扩展关键字来声明对一个外部函数的引用为弱引用,比如下面这段代码:

__attribute__ ((weakref)) void foo();

int main()
{
    foo();
}

我们可以将它编译成一个可执行文件,GCC并不会报链接错误。但是当我们运行这个可执行文件时,会发生运行错误。因为当main函数试图调用foo函数时,foo 函数的地址为0,于是发生了非法地址访问的错误。一个改进的例子是:

__attribute__ ((weakref)) void foo();

int main()
{
    if(foo) foo();
}

这种弱符号和弱引用对于库来说十分有用,比如库中定义的弱符号可以被用户定义的强符号所覆盖,从而使得程序可以使用自定义版本的库函数;或者程序可以对某些扩展功能模块的引用定义为弱引用,当我们将扩展模块与程序链接在一起时,功能模块就可以正常使用;如果我们去掉了某些功能模块,那么程序也可以正常链接,只是缺少了相应的功能,这使得程序的功能更加容易裁剪和组合。

From #

程序员的自我修养