美文网首页
__attribute__((visibility("

__attribute__((visibility("

作者: lltree | 来源:发表于2018-03-26 17:44 被阅读184次
    #ifdef __cplusplus  //如果是C++语言
    #define PASSPORT_EXTERN         extern "C" __attribute__((visibility ("default")))
    #else
    #define PASSPORT_EXTERN         extern __attribute__((visibility ("default")))
    #endif
    

    GNU C 的一大特色就是attribute 机制。
    试想这样的情景,程序调用某函数A,A函数存在于两个动态链接库liba.so,libb.so中,并且程序执行需要链接这两个库,此时程序调用的A函数到底是来自于a还是b呢?
    这取决于链接时的顺序,比如先链接liba.so,这时候通过liba.so的导出符号表就可以找到函数A的定义,并加入到符号表中,链接libb.so的时候,符号表中已经存在函数A,就不会再更新符号表,所以调用的始终是liba.so中的A函数。
    为了避免这种混乱,所以使用

    __attribute__((visibility("default")))  //默认,设置为:default之后就可以让外面的类看见了。
    __attribute__((visibility("hideen")))  //隐藏
    

    设置这个属性。

    isibility用于设置动态链接库中函数的可见性,将变量或函数设置为hidden,则该符号仅在本so中可见,在其他库中则不可见。

    g++在编译时,可用参数-fvisibility指定所有符号的可见性(不加此参数时默认外部可见,参考man g++中-fvisibility部分);若需要对特定函数的可见性进行设置,需在代码中使用attribute设置visibility属性。

    编写大型程序时,可用-fvisibility=hidden设置符号默认隐藏,针对特定变量和函数,在代码中使用attribute ((visibility("default")))另该符号外部可见,这种方法可用有效避免so之间的符号冲突。(这里不是很理解)

    相关文章

      网友评论

          本文标题:__attribute__((visibility("

          本文链接:https://www.haomeiwen.com/subject/fmgrcftx.html