【LLVM笔记】0x00 初识LLVM 连接类型

模块结构

LLVM程序是由若干的模块(Module)组成,每一个模块中包含有一些函数、全局变量和符号表。 这些模块可能由LLVM的链接器组合在一块儿,组合的过程将会整合这些函数和全局变量的定义,整合他们的符号表。数组

链接类型

全部的全局变量和函数都有一个伴随它的链接类型,将会有如下几种:app

  1. private。当变量被声明为private链接类型时,这个变量将只能被它所在的模块所调用。当链接一个模块时,模块中被声明为private链接类型的变量可能会被更名,而且该变量将不会出如今object文件的符号表中。
  2. internal。与private行为相似,但变量将会以本地符号(ELF格式下的STB_LOCAL)的形式出现object文件中。
  3. available_externally。 该类型的全局值,将不会出如今object文件当中。从链接器的角度看,一个available_externally等价于一个外部声明。容许包括内联在内的优化行为。值得注意的是,这种类型只能被定义,不可被声明。
  4. linkonce。 当链接器工做时,将会把该类型的全局值与其余与之同名的全局值合并。它常被用于内联函数、模板等方面。
  5. weak。 与linkonce相似,都会与其余与之同名的全局值进行合并,但未引用的带weak标识的全局值可能会被抛弃。
  6. common。 与weak相似,但经常使用于C语言中暂定的变量定义。带有common的全局值和带有weak符号的全局值合并的方式相同,但即便没有被引用也不会被删除。common可能不会有一个明确的部分,但必须初始化为0,且不可能被标志为constant。函数和切片不能够带有common标识。
  7. appending。 只能用于数组类型的全局指针变量。
  8. extern_weak。 遵循ELF对象文件模型:除非被连接,不然带有extern_weak的符号都是weak的但若是没有被连接,那该符号会变成null而不是未定义引用。
  9. linkonce_odr, weak_odr。 某些语言容许不一样的全局值被合并,这些语言可使用这两个连接标识代表全局值将只与等下批的全局值合并。
  10. external。 若是上述标识符都没有被使用,那么该全局值是外部可见的。这意味着它参与连接,能够用于处理外部符号引用。

值得注意的是 函数只能拥有 external 或 extern_weak 两种连接标识。函数

相关文章
相关标签/搜索