相关的宏定义
#define __LIBC_HIDDEN__ __attribute__((visibility("hidden")))
#define __LIBC_EXPORT__ __attribute__((visibility("default")))
相关的编译项
-fvisibility=default|hidden(这个是编译项,是gcc通知编译器的)
-Wl,-export-dynamic or -rdynamic(这个是链接项,是gcc通知链接器的)
符号可见的两个要素
1 符号导出行为(so默认导出,exe默认只有被其它so用的符号才导出)
2 符号可见性(编译的时候指定,默认都是可见的)
只有1,2都判断成功,符号才会被导出到.dynsym表中
基本原理
1 -fvisibility=hidden,是编译属性,决定了每个obj中全局符号的hidden or default(visibility)
2 完成所有obj的链接后,会根据如下规则来完成符号导出
1 是exe(默认没有符号导出行为,但可以通过-export-dynamic改变默认行为)
2 是so(默认是有符号导出行为的)
3 判断完1,2后,进行符号可见性的判断(即Vis属性)
上述条件都满足,则export符号到.dynsym表中,注意最后生成的exe或者so文件
是没有Vis属性的,因为这个时候Vis已经整合到Bind属性中(local or global)
网友评论