gcc __attribute__关键字举例之visibility
来源:互联网 发布:ubuntu smplayer 安装 编辑:程序博客网 时间:2024/06/04 18:32
visibility用于设置动态链接库中函数的可见性,将变量或函数设置为hidden,则该符号仅在本so中可见,在其他库中则不可见。
g++在编译时,可用参数-fvisibility指定所有符号的可见性(不加此参数时默认外部可见,参考man g++中-fvisibility部分);若需要对特定函数的可见性进行设置,需在代码中使用__attribute__设置visibility属性。
编写大型程序时,可用-fvisibility=hidden设置符号默认隐藏,针对特定变量和函数,在代码中使用__attribute__ ((visibility("default")))另该符号外部可见,这种方法可用有效避免so之间的符号冲突。
下面是visibility的实例,这里extern “C”可以省略(另外两篇文章gcc __attribute__关键字举例之alias和C++覆盖系统函数的方法中extern "C"不可用省略)。
值得注意的是,visibility2.cc中可以调用fun1,原因是visibility1.o和visibility2.o同属于一个so文件。
visibility1.cc:
#include <stdio.h>extern "C" void fun1(){ printf("in %s\n",__FUNCTION__);}__attribute__ ((visibility("hidden"))) void fun1();//若编译此文件时使用了参数-fvisibility=hidden,则此行可以省略
visibility2.cc:
#include <stdio.h>extern "C" void fun1();extern "C" void fun2(){ fun1(); printf("in %s\n",__FUNCTION__);}__attribute__ ((visibility("default"))) void fun2();//若编译此文件时没有使用参数-fvisibility或设置参数-fvisibility=default,则此行可以省略
main.cc:
extern "C" void fun1();extern "C" void fun2();int main(){ fun1(); fun2(); return 0;}
Makefile:
all:testtest:main.o libvisibility.so g++ -o test main.o -lvisibility -L .main.o::main.cc g++ -c main.cclibvisibility.so:visibility1.o visibility2.o g++ -shared -o libvisibility.so visibility1.o visibility2.ovisibility1.o:visibility1.cc g++ -fvisibility=hidden -fPIC -c visibility1.ccvisibility2.o:visibility2.cc g++ -fvisibility=hidden -fPIC -c visibility2.ccclean: rm -f *.o *.so test
编译和输出:
$ makeg++ -c main.ccg++ -fvisibility=hidden -fPIC -c visibility1.ccg++ -fvisibility=hidden -fPIC -c visibility2.ccg++ -shared -o libvisibility.so visibility1.o visibility2.og++ -o test main.o -lvisibility -L .main.o: In function `main':main.cc:(.text+0x5): undefined reference to `fun1'collect2: ld returned 1 exit statusmake: *** [test] Error 1
可以看到,main()中可以不可用调用fun1,可以调用fun2,因为fun1已经设置为外部不可见,fun2设置为外部可见。
使用readelf对各个.o文件分析可以看到,fun1的Vis属性为HIDDEN,fun2的Vis属性为DEFAULT:
$ readelf -s visibility1.o|grep fun 6: 0000000000000007 5 OBJECT LOCAL DEFAULT 6 _ZZ4fun1E12__FUNCTION__ 12: 0000000000000000 30 FUNC GLOBAL HIDDEN 2 fun1$ readelf -s visibility2.o|grep fun 6: 0000000000000007 5 OBJECT LOCAL DEFAULT 6 _ZZ4fun2E12__FUNCTION__ 12: 0000000000000000 35 FUNC GLOBAL DEFAULT 2 fun2 15: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND fun1$ readelf -s libvisibility.so|grep fun 9: 00000000000006ac 35 FUNC GLOBAL DEFAULT 12 fun2 41: 000000000000071d 5 OBJECT LOCAL DEFAULT 14 _ZZ4fun1E12__FUNCTION__ 43: 0000000000000729 5 OBJECT LOCAL DEFAULT 14 _ZZ4fun2E12__FUNCTION__ 48: 000000000000068c 30 FUNC LOCAL HIDDEN 12 fun1 54: 00000000000006ac 35 FUNC GLOBAL DEFAULT 12 fun2
参考:
Function Attributes
Visibility Pragmas
GCC扩展 __attribute__ ((visibility("hidden")))- gcc __attribute__关键字举例之visibility
- gcc __attribute__关键字举例之visibility
- gcc __attribute__关键字举例之visibility
- gcc __attribute__关键字举例之visibility
- gcc __attribute__关键字举例之alias
- gcc __attribute__关键字举例之constructor/destructor
- GCC系列: __attribute__((visibility("")))
- GCC扩展 __attribute__ ((visibility("hidden")))
- GCC编译关键字“__attribute__”
- GCC使用__attribute__关键字
- __attribute__ ((visibility("default")))
- __attribute__((visibility("default")))
- __attribute__((visibility("default")))
- __attribute__((visibility("default")))
- __attribute__((visibility("default")))
- __attribute__((visibility("default")))
- __attribute__((visibility("default")))
- __attribute__((visibility("default")))
- .Java程序员从笨鸟到菜鸟之(四十一)细谈struts2(五)action基础知识和数据校验
- Linux命令的学习与数学公式
- Maven学习
- Perl socket编程
- 10个小时尚未完成XNA中文字体的转换
- gcc __attribute__关键字举例之visibility
- 使用fmdb进行SQLlite 操作
- 软件工程积累——UML之用例图
- JSP BASEPATH
- android编译系统的makefile文件Android.mk写法如下
- Linux下SVN服务器搭建(CentOS+Subversion)
- 移动应用表单设计
- 持续集成实践成熟度模型
- POJ 1007 DNA Sorting