2014-01-23 29 views
1

使用.so文件鏈接時間或在運行時使用它(dlopen()等)之間的主要區別是什麼?動態庫(.so):鏈接時間和運行時間

  1. 在鏈接時使用什麼樣的驗證?
  2. 頭文件的作用是什麼?頭文件列出了暴露在.so之外並用在目標二進制文件中的方法?
  3. 在這兩種情況下地址空間是如何查找的?
+0

關於第2點,頭文件在鏈接時間或運行時期間從不參與*。 –

+0

我的意思是,頭文件列出了暴露出庫的方法的作用是什麼? – Dexter

+0

那真的是這樣。頭文件中的函數原型告訴編譯器某處存在一個名爲this或者那個函數。編譯器不知道這些函數是在哪裏定義的,並不關心,它只需要聲明(原型)。當然,頭文件可以包含的不僅僅是函數原型,如結構定義和類型別名。 –

回答

1
  1. 在鏈接時,編譯器將只檢查符號庫中可用,將指定打擊後鏈接的庫(在你鏈接多個庫的相同符號的情況下)

  2. 頭文件只會告訴編譯器哪些函數原型是可用的(取決於所使用的編程語言)如何將它們轉換爲符號。例如C++ extern "C"

  3. 如果您正在鏈接一個庫,那麼鏈接器將在可執行文件中創建一個全局地址轉換表,該表將在運行時在庫加載時填充符號地址。如果您使用dlopen打開庫,那麼您有責任通過dlsym自己創建保存符號指針的變量,但它可以讓您獲得更大的靈活性,例如,在運行時更改它們,加載插件或編譯時不可用的其他函數。

相關問題