Table of Contents

__attribute__((visibility("default")))

1. 当-fvisibility=hidden时

2. 当-fvisibility=default时


// Generic helper definitions for shared library support
#if defined _WIN32 || defined __CYGWIN__#define SRSLTE_IMPORT __declspec(dllimport)#define SRSLTE_EXPORT __declspec(dllexport)#define SRSLTE_LOCAL
#else#if __GNUC__ >= 4#define SRSLTE_IMPORT __attribute__ ((visibility ("default")))#define SRSLTE_EXPORT __attribute__ ((visibility ("default")))#else#define SRSLTE_IMPORT#define SRSLTE_EXPORT#define SRSLTE_LOCAL#endif
#endif

__attribute__((visibility("default")))

可以看到OBJC_VISIBLE 的定义方式是 __attribute__((visibility("default"))).

那么究竟有什么作用呢? 下面举例说明.

GCC 有个visibility属性, 该属性是说, 启用这个属性:

1. 当-fvisibility=hidden时

动态库中的函数默认是被隐藏的即 hidden. 除非显示声明为__attribute__((visibility("default"))).

2. 当-fvisibility=default时

动态库中的函数默认是可见的.除非显示声明为__attribute__((visibility("hidden"))).

特别说明: 这个特性是 GCC4.0 以后才有的.

基于GCC系列: 加载静态链接库的例子, 谈谈 visibility.

Car.c

#include<stdio.h>
#include<stdlib.h> __attribute ((visibility("default"))) int drive()
{printf("Car driving...\n");return 0;
}void stop()
{printf("Car stop.\n");
}

注意: attribute 的定义和使用方法.
使用 visibility 属性来编译动态链接库.

g++-4.9 -shared -o libCar.so -fvisibility=hidden Car.c
这样一来, drive 方法是可见的, 但是 stop 是不可见的.

作者:veryitman 
来源:CSDN 
原文:https://blog.csdn.net/veryitman/article/details/46756683 
版权声明:本文为博主原创文章,转载请附上博文链接!


在Linux下动态库(.so)中,通过GCC的C++ visibility属性可以控制共享文件导出符号。在GCC 4.0及以上版本中,有个visibility属性,可见属性可以应用到函数、变量、模板以及C++类。

限制符号可见性的原因:从动态库中尽可能少地输出符号是一个好的实践经验。输出一个受限制的符号会提高程序的模块性,并隐藏实现的细节。动态库装载和识别的符号越少,程序启动和运行的速度就越快。导出所有符号会减慢程序速度,并耗用大量内存。

“default”:用它定义的符号将被导出,动态库中的函数默认是可见的。”hidden”:用它定义的符号将不被导出,并且不能从其它对象进行使用,动态库中的函数默认是被隐藏的。default意味着该方法对其它模块是可见的。而hidden表面该方法符号不会被放到动态符号表里,所以其它模块(可执行文件或者动态库)不可以通过符号表访问该方法。

要定义GNU属性,需要包含__attribute__和用括号括住的内容。可以将符号的可见性指定为visibility(“hidden”),这将不允许它们在库中被导出,但是可以在源文件之间共享。实际上,隐藏的符号将不会出现在动态符号表中,但是还被留在符号表中用于静态链接。

导出列表由编译器在创建共享库的时候自动生成,也可以由开发人员手工编写。导出列表的原理是显式地告诉编译器可以通过外部文件从对象文件导出的符号是哪些。GNU用户将此类外部文件称作为”导出映射”。

作者:fengbingchun 
来源:CSDN 
原文:https://blog.csdn.net/fengbingchun/article/details/78898623 
版权声明:本文为博主原创文章,转载请附上博文链接!

__attribute__((visibility()))相关推荐

  1. Linux下__attribute__((visibility (default)))的使用

    在Linux下动态库(.so)中,通过GCC的C++ visibility属性可以控制共享文件导出符号.在GCC 4.0及以上版本中,有个visibility属性,可见属性可以应用到函数.变量.模板以 ...

  2. C语言之__attribute__((visibility(“default“)))等gcc flag讲解(六十二)

    目录 1.概述 2.程序说明 <1>.test.h <2>.test.c <3>.main.c 3.编译实验 <1>.gcc显示声明:-fvisibil ...

  3. __attribute__((visibility(default)))

    网址:http://blog.csdn.net/mutourenzhang/article/details/47803803 网址:http://www.cnblogs.com/fortunely/p ...

  4. gcc __attribute__关键字举例之visibility

    visibility用于设置动态链接库中函数的可见性,将变量或函数设置为hidden,则该符号仅在本so中可见,在其他库中则不可见. g++在编译时,可用参数-fvisibility指定所有符号的可见 ...

  5. __attribute__ 总结

    attribute是GNU C特色之一,在iOS用的比较广泛.系统中有许多地方使用到. attribute可以设置函数属性(Function Attribute ).变量属性(Variable Att ...

  6. static 和 visibility hidden 的区别

    做 C 的人都知道如果所定义函数只在本文件中用,那么应该声明为 static 但看 Android 看 bionic 的代码bionic/libc/bionic/pthread.c 发现有这样的代码片 ...

  7. __attribute__概述

    __attribute__ 关键字允许指定变量.类型和函数的属性 该关键字的格式如下所示 __attribute__((attribute1, attribute2, ...)) __attribut ...

  8. pybind11介绍

          pybind11是一个轻量级的仅头文件库,主要用于创建现有C++代码的Python绑定,它的源码在https://github.com/pybind/pybind11,license为BS ...

  9. C++中插件使用举例

    插件并不是在构建时链接的,而是在运行时发现并加载的.因此,用户可以利用你定义好的插件API来编写自己的插件.这样他们就能以指定方式扩展API的功能.插件库是一个动态库,它可以独立于核心API编译,在运 ...

最新文章

  1. 一文详解「群体机器人」中的「实体进化」到底是什么?
  2. Vue中使用a标签实现点击在新标签页中打开实现照片预览
  3. [html] input元素size属性和width 的区别是什么?
  4. Service Mesh 落地挑战
  5. pip安装requirement.txt
  6. Verizon收购雅虎交易完成 硅谷第一美女梅耶尔辞职
  7. Lingo解决最优化问题
  8. 使用JavaParser进行java源码解析
  9. 阿里云云计算 34 RDS的概念
  10. 瑞友天翼 mysql 密码_瑞友天翼忘记密码的处理方法.doc
  11. 用Python能下载抖音无水印视频?免费教程来了!
  12. 各国程序员薪资水平,看完我想静静。。。
  13. 六自由度工业机器人 机械手臂 3D2D结构图纸 工业机器人
  14. 为什么onenote一直在加载_超好用的笔记软件,Onenote是我的最爱
  15. 远程小组软件开发过程(2):工具
  16. 2019世界机器人大会圆满落幕
  17. 关系型数据库设计-6种范式
  18. 怎样避免论文查重率过高
  19. BBS论坛系统的设计与实现
  20. python安装0x80072ee7_Win8系统无法打开应用商店且提示“服务器错误”及错误代码0x80072EE7的解决方法...

热门文章

  1. deepin配置JDK
  2. Docker启动失败提示【exec user process caused: exec format error】
  3. antd pro中如何使用mock数据以及调用接口
  4. 6 功能4:文章详情页、点赞功能
  5. (转)Vue 爬坑之路(四)—— 与 Vuex 的第一次接触
  6. iOS CoreData简单入门 - Swift版
  7. 解读ASP.NET 5 MVC6系列(13):TagHelper
  8. 【JNI知识一】--JNI接口函数与指针
  9. php输出0到100所有数,php-循环从1到100的数字,每10个数字将数字除以10
  10. 2018mysql数据库面试题_面试题: mysql 数据库去重 已看1 不好使