【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 兩種連接標識。函數

相關文章
相關標籤/搜索