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

When did Clang add visibility support for shared objects?

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 何时添加可见性支持?它一直可用吗?

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

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

如你所见,变量"a"在第一张图片中导出,但在第二张图片中,我隐藏了它,它不再在符号table中。我也继续隐藏最后一张图片中的功能,它们也不在符号 table.

我认为这是有效的标志。在 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 $