2013-06-12 49 views
2

這是一個後續行動這樣一個問題:Can the linker inline functions?動態庫中定義的小函數是否可以內聯?

這一次,我想知道差不多的優化,而不是在鏈接時,但在運行時鏈接到一個動態庫時。它有可能嗎?現代操作系統做到了嗎?爲什麼?

+1

如果庫提供者打算將小函數內聯,他們可以在庫附帶的頭文件中提供這些函數的定義。 – jxh

+1

請注意,只有在庫函數操作的數據結構是公共API的一部分時,才應使用建議的方法@jxh。如果不是這樣,這些內聯函數將把庫的數據結構的非公開API知識包含在針對庫構建的應用程序中,並且如果未來版本的庫想要對這些非公共結構進行任何更改,應用程序將嚴重破壞如果與新版本的庫一起使用。這可以通過庫版本管理來處理,但是隨後您會強制用戶保留舊版本的庫... –

回答

4

理論上這是可能的,但有很多理由不這樣做。在實踐中,「動態鏈接」並不是完全鏈接的;除了主程序(也可能是主程序)之外的所有其他位置都使用與位置無關的代碼,因此不需要全部(靜態)鏈接程序可能必須執行的全部重定位。相反,只需要少量的重定位類型,這些重定位類型基本上相當於填充大型連續表中庫中包含的函數和對象的地址。當然,這些在.data段中的靜態存儲持續時間的對象中的引用也必須填入,所以它的工作量要比填充連續表的要多一點,但關鍵點是隻有數據而不是代碼被修改。

如果您開始修改代碼,則會拋棄動態鏈接的大部分優點:代碼頁無法在應用程序/庫的多個實例中共享,並且在啓動時會花費更多時間進行復制(通過頁面錯誤和寫時複製語義)映射的代碼頁。這僅僅是在代碼中修補幾個字節的最小代價。

對於從動態庫實際內聯代碼,你必須做的事情將相當於完整的鏈接時間優化。測量LTO鏈接大型程序需要多少時間,然後問問自己,如果用戶在每次啓動程序時等待這麼長時間,是否可以接受。答案几乎肯定不是。

+0

感謝您提供非常乾淨和翔實的答案! –

相關問題