Clang何时为共享对象添加可见性支持?

时间:2015-03-01 07:28:55

标签: c++ clang visibility

GCC在版本4.0中添加了visibility support。我的make中有以下内容,它将共享对象的大小减少了大约1/3(1.5 MB):

GCC40_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -c "^gcc version ([4-9])")
ifeq ($(GCC40_OR_LATER),1)
  CXXFLAGS += -fvisibility=hidden -fvisibility-inlines-hidden
endif

我想为Clang添加类似的规则。 Clang什么时候增加了可视性支持?它一直可用吗?

1 个答案:

答案 0 :(得分:2)

确认它在3.3+。我没有测试任何较低版本,但我愿意打赌它存在并且一直存在。我测试了3.3,3.4,3.5,3.6和3.7。

获取其他" new"的列表属性(对于3.7),请参阅:http://clang.llvm.org/docs/AttributeReference.html

enter image description here

正如您所看到的,变量" a"在第一张图片中导出,但在第二张图片中,我隐藏了它,它不再在符号表中。我继续隐藏最后一张图片中的函数,它们也不在符号表中。

我认为这是它有效的标志。在Linux Mint Rebecca上测试过,没有安装gcc或g ++或mingw或其他任何东西。只是代码块和clang以及llvm。在构建clang之后我已经卸载了gcc和g ++(以避免冲突和问题,如果有任何问题出现[我怀疑会发生,但我是迂腐的])。

注意:我尝试#define the hidden attribute,但没有雪茄。

对于那些喜欢文本输出的人:

kira@Kira ~/Desktop/shm/bin/Debug $ nm -gC liblibshm.so

0000000000200980 B __bss_start
                 w __cxa_finalize@@GLIBC_2.2.5
0000000000200980 D _edata
0000000000200988 B _end
0000000000000628 T _fini
                 w __gmon_start__
00000000000004b0 T _init
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 w _Jv_RegisterClasses

kira@Kira ~/Desktop/shm/bin/Debug $ clang++ --version

Ubuntu clang version 3.3-16ubuntu1 (branches/release_33) (based on LLVM 3.3)
Target: x86_64-pc-linux-gnu
Thread model: posix

kira@Kira ~/Desktop/shm/bin/Debug $