作用:声明变量符号的"生命周期","访问空间"等.
private:和一般的面向对象语言一样,只能在模块内访问,即函数以及标识符不会被外部对象引用.特别地,将代码链接到具有私有全局值的模块中可能导致根据需要重命名私有值,以避免冲突。因为符号对于模块是私有的,所以所有引用都可以被更新。这不会出现在对象文件中的任何符号表中(即对于C/C++来讲,该函数以及变量不会在*.o文件中有对应的符号表).
internal:类似于C中的static(静态限定本文件),能够出现在*.o文件中,但是仅限本文件.
available_externally:“可用外部链接”的全局变量从不被释放到对应于LLVM模块的对象文件中。从链接器的角度来看,一个可用的外部全局变量相当于一个外部声明。它们存在以允许内联和其他优化发生在给定全局定义的知识的情况下,这已知在模块之外的某个地方。允许可用外部链接的全局变量被丢弃,允许内联和其他优化。这种链接类型只允许在定义上,而不允许在声明中使用。(这个没看懂,貌似是extern函数?)
linkonce:当链接发生时,具有“链接链接”的全局变量与同名的其他全局变量合并。这可以用来实现某些形式的内联函数、模板或其他代码,这些代码必须在使用它的每个翻译单元中生成,但是以后可以用更明确的定义重写正文。未被引用的Link一次全局允许被丢弃。请注意,Link一链接实际上不允许优化器将这个函数的主体内联到调用方中,因为它不知道函数的这个定义是否是程序内的最终定义,或者它是否会被更强的定义所覆盖。要启用内联和其他优化,请使用“Link”.(内联函数,模板,以及宏,发生在编译时期的初始化.)
weak:“weak”链接与(Linkone)具有相同的合并语义,只是不可以丢弃具有弱链接的未引用全局。这用于在C源代码中声明为“弱”的全局变量。(不理解,C不是强类型语言吗?)
common:“common”链接最类似于“weak”链接,但它们用于C中的初步定义,比如全局范围的“int X;”。与“普通”链接的符号以弱符号相同的方式合并,如果未引用,它们可能不会被删除。公共符号可能不具有显式部分,必须具有零初始化器,并且不能标记为“常数”。函数和引用(alias)可能不具有公共链接。
appending:“appending”链接只能应用于指向数组类型的指针的全局变量。当两个具有appending链接的全局变量被链接在一起时,两个全局数组被附加在一起。这是LLVM,typesafe,相当于当链接到.o文件时,系统链接器将具有相同名称的“sections”附加在一起。不幸的是,这与.o文件中的任何特性都不对应,因此它只能用于llvm专门解释的变量llvm.._ctors。
extern_weak:这种链接的语义遵循ELF对象文件模型:符号是弱的,直到链接到符号(如果未链接)时,符号才变为空,而不是未定义的引用。
linkonce_odr
, weak_odr:有些语言允许合并不同的全局,例如两个具有不同语义的函数。其他语言,如C++,确保只有统一的全局被合并(
the “one definition rule” — “ODR”)。这些语言可以使用linkonce_odr和._odr链接类型来指示全局只与等效全局合并。这些链接类型与它们的
non-odr版本是相同的。
external:如果没有使用上述标识符,则全局是外部可见的,这意味着它参与链接并且可以用于解析外部符号引用。
函数声明除了外部或外部弱外,任何链接类型都是非法的。