目录

1.概述

2.程序说明

<1>.test.h

<2>.test.c

<3>.main.c

3.编译实验

<1>.gcc显示声明:-fvisibility=default

<2>.gcc显示声明:-fvisibility=hidden

<3>.gcc显示声明:-fvisibility=internal

<4>.gcc显示声明:-fvisibility=protected


1.概述

-fvisibility=default / internal / hidden / protected

上述表示:

 <1>.gcc在编译动态库的时候visibility有四个选项,只有使用default和protected选项编译时,编译出来的动态库的符号是可以被外界调用的;

 <2>.而编译时使用internal和hidden选项时,如果函数内没有:__attribute ((visibility("default")))声明,动态库使隐藏的不可被外界调用。

2.程序说明

<1>.test.h

#include<stdio.h>__attribute ((visibility("default"))) void test_01();
void test_02();

<2>.test.c

#include "test.h"//test_01表示是"default"显示定义,说明可以被外界函数调用和导出。
__attribute ((visibility("default"))) void test_01 (){printf("xxx------->%s()\n",__FUNCTION__);
}//test_01表示隐士定义,如果gcc编译时,参数为-fvisibility=hidden,则不能被导出和外界调用。
void test_02(){printf("xxx------->%s()\n",__FUNCTION__);
}

<3>.main.c

#include "test.h"
int main(){test_01();test_02();return 0;
}

3.编译实验

<1>.gcc显示声明:-fvisibility=default

编译动态库libtest.so: 

# gcc -fPIC -shared -o libtest.so -fvisibility=default test.c

查看动态库符号表状态:

# readelf -s libtest.so |grep test_6: 0000000000001142    41 FUNC    GLOBAL DEFAULT   14 test_027: 0000000000001119    41 FUNC    GLOBAL DEFAULT   14 test_0122: 0000000000001119    41 FUNC    GLOBAL DEFAULT   14 test_0126: 0000000000001142    41 FUNC    GLOBAL DEFAULT   14 test_02
注意:
可以看到test_01()和test_02()函数都是GLOBAL DEFAULT状态,说明此libtest.so可以被外界导出和调用的。

编译main.c,并链接到libtest.so: 

# gcc main.c -L ./ -ltest -o main

编译无报错,说明libtest.so里的两个函数都可以被导出和调用。

运行

# export LD_LIBRARY_PATH=.
# ./main
xxx------->test_01()
xxx------->test_02()

<2>.gcc显示声明:-fvisibility=hidden

编译动态库libtest.so: 

# gcc -fPIC -shared -o libtest.so -fvisibility=hidden test.c

查看动态库符号表状态:

# readelf -s libtest.so |grep test_6: 0000000000001119    41 FUNC    GLOBAL DEFAULT   14 test_0117: 0000000000001142    41 FUNC    LOCAL  DEFAULT   14 test_0223: 0000000000001119    41 FUNC    GLOBAL DEFAULT   14 test_01注意:
test_02()函数为LOCAL  DEFAULT局部函数,说明不能被外界导出和调用。因为在test_02()函数没有
声明__attribute ((visibility("default"))),所以为局部隐藏,不能被外界调用。

编译main.c,并链接到libtest.so: 

# gcc main.c -L ./ -ltest -o main
/usr/bin/ld: /tmp/ccD5TD6O.o: in function `main':
main.c:(.text+0x18): undefined reference to `test_02'
collect2: error: ld returned 1 exit status

编译报错,说明libtest.so里的test_02()函数不可以被导出和调用。

<3>.gcc显示声明:-fvisibility=internal

编译动态库libtest.so: 

# gcc -fPIC -shared -o libtest.so -fvisibility=internal test.c

查看动态库符号表状态:

# readelf -s libtest.so |grep test_6: 0000000000001119    41 FUNC    GLOBAL DEFAULT   14 test_0117: 0000000000001142    41 FUNC    LOCAL  DEFAULT   14 test_0223: 0000000000001119    41 FUNC    GLOBAL DEFAULT   14 test_01注意:
test_02()函数为LOCAL  DEFAULT局部函数,说明不能被外界导出和调用。因为在test_02()函数没有
声明__attribute ((visibility("default"))),所以为局部隐藏,不能被外界调用。

编译main.c,并链接到libtest.so: 

# gcc main.c -L ./ -ltest -o main
/usr/bin/ld: /tmp/ccD5TD6O.o: in function `main':
main.c:(.text+0x18): undefined reference to `test_02'
collect2: error: ld returned 1 exit status

编译报错,说明libtest.so里的test_02()函数不可以被导出和调用。

<4>.gcc显示声明:-fvisibility=protected

 编译动态库libtest.so: 

# gcc -fPIC -shared -o libtest.so -fvisibility=protected test.c

查看动态库符号表状态:

# readelf -s libtest.so |grep test_6: 0000000000001142    41 FUNC    GLOBAL DEFAULT   14 test_027: 0000000000001119    41 FUNC    GLOBAL DEFAULT   14 test_0122: 0000000000001119    41 FUNC    GLOBAL DEFAULT   14 test_0126: 0000000000001142    41 FUNC    GLOBAL DEFAULT   14 test_02
注意:
可以看到test_01()和test_02()函数都是GLOBAL DEFAULT状态,说明此libtest.so可以被外界导出和调用的。

编译main.c,并链接到libtest.so: 

# gcc main.c -L ./ -ltest -o main

编译无报错,说明libtest.so里的两个函数都可以被导出和调用。

运行

# export LD_LIBRARY_PATH=.
# ./main
xxx------->test_01()
xxx------->test_02()

C语言之__attribute__((visibility(“default“)))等gcc flag讲解(六十二)相关推荐

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

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

  2. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  3. __attribute__((visibility(default)))

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

  4. C语言试题六十二之请编写函数fun除了字符串前导和尾部的*号之外,将串中其他*号全部删除。形参h已指向字符串第一个字母,形参p已指向字符串中最后一个字母。在编写程序时,不得使用c语言提供的字符串函数。

    1. 题目 请编写函数fun除了字符串前导和尾部的*号之外,将串中其他*号全部删除.形参h已指向字符串第一个字母,形参p已指向字符串中最后一个字母.在编写程序时,不得使用c语言提供的字符串函数. 比如 ...

  5. python语言平台无关_从零开始学Python自然语言处理(十二)——上下文无关文法...

    前文传送门: 在说上下文无关文法之前,我们来看看形式语言理论,什么是形式语言理论?形式语言理论形式语言理论是用数学方法研究自然语言或者程序设计语言的理论.研究语言组成规则,而不研究语言的具体含义.说到 ...

  6. c语言上机填空改错试题,2013年计算机二级C语言上机试题六十二及答案

    2013年计算机二级.一级.三级等更多考试考前培训请进入教育联展网-中国教育培训第一门户,助您顺利通过计算机等级考试! 填空题 请补充main函数,该函数的功能是:从键盘输入一组字符串,以'*'结束输 ...

  7. 中国大学MOOC C语言程序设计(大连理工大学) 课后编程题 第十二周题解(个人向仅供参考)

    第十二周 指针二 1 利用指针编写一函数,输入3个整数,按由大到小的顺序将它们输出.(15分) 题目内容:利用指针编写一函数,输入3个整数,按由大到小的顺序将它们输出. 输入格式: %d 输出格式: ...

  8. __attribute__((visibility()))

    Table of Contents __attribute__((visibility("default"))) 1. 当-fvisibility=hidden时 2. 当-fvi ...

  9. C语言程序设计笔记(浙大翁恺版) 第十周:字符串

    按照中国大学MOOC上浙江大学翁恺老师主讲的版本所作,B站上也有资源.原课程链接如下: https://www.icourse163.org/course/ZJU-9001 由于是大三抽空回头整理的, ...

最新文章

  1. jieba之sedict(自定义字典)
  2. python 结构体数组 定义_一篇文章弄懂Python中所有数组数据类型
  3. 算法提高课-搜索-最小步数模型-AcWing 1107. 魔板:bfs、复杂、八数码类似的题目
  4. 线下沙龙 | 小身材大能量!用英伟达智能小车Jetbot玩转深度学习
  5. python中html.parser_在Python中使用HTMLParser解析HTML的教程
  6. [SHOI2008]cactus仙人掌图
  7. 源码安装的php如何启动脚本,PHP源码编译安装管理常用脚本
  8. 集群和分布式部署有什么区别?
  9. Origin绘制带误差棒的曲线(Error Band)
  10. 电脑更新重启后黑屏_手机黑屏了,重启后万事大吉?那可就错了!
  11. python中for用法_python中for的用法探索
  12. MFC控件使用总结——CListCtrl
  13. SAP License:特殊采购类型-寄售及其结算
  14. VC静态加载DLL和动态加载DLL
  15. 自学python免费教材-最好的Python入门教材是哪本?
  16. java协程处理IO_并发编程 --进、线程池、协程、IO模型
  17. 点线面的意义_如何运用设计中的点线面?
  18. 计算机系第一学期电脑,公共课第一学期《计算机基础》.doc
  19. Tomcat 下载、安装、配置图文教程
  20. 数据库多表查询关联查询SQL语句

热门文章

  1. 基于规则的语音合成中文文本前端设计
  2. 大数据产品开发流程规范_大数据开发流程规范化(最新数据流图及相关数据技术分析)...
  3. 2020年一套正版的solidworks多少钱
  4. SVN提交错误:系统找不到指定路径
  5. numpy中ravel()与flatten()的区别
  6. 嵌入式开发--CubeMX使用入门教程
  7. python列表删除元素问题+指针问题进阶杂谈
  8. Git如何修改commit信息
  9. 幅相曲线渐近线_若最小相位系统的低频段幅频特性的渐近线是一条斜率为20dB/dec的直线,则该系统( )。_学小易找答案...
  10. Gank英雄,意为Dota中的偷袭、包抄、围杀!