LLVM IR 可见性模式

在LLVM程序中,所有全局变量和函数具有以下的可见性模式之一:

“default” – Default style

在那些使用ELF object file格式的平台,默认可见性意味着声明对于其他模块是可见的,,并且在可共享库,意味着这个声明的实体是可被覆盖的。在Darwin平台,默认可见性意味着声明对于其他模块是可见的。默认可见性与在链接类型中的“external linkage” 是一致的。

“hidden” – Hidden style

一个对象的带有hidden可见性的两个声明,如果它们是处于一个相同的可共享单元(shared object),那么它们会被引用到一个相同的对象。通常来说,hidden可见性表明符号不会被放置到动态符号表,所以其他模块(可执行程序或共享库)不可以直接引用这个符号。

“protected” – Protected style

在ELF中,protected可见性表明符号会被放置到动态符号表,但在特定模块中的这些引用会绑定到一个本地的符号。所以这个符号不能被其他模块覆盖。

注意:带internal或private链接的符号必须具有default可见性。