2014-01-06 41 views
2

我目前正在實現一個基於嵌入式Linux的系統。持久數據從NAND閃存加載。 userland中的第一個應用程序之一是使用libglib的一些功能。對於該系統,低啓動時間非常重要。因爲glib很大,而且NAND速度很慢,所以很多人認爲啓動速度減慢了,因爲整個glib必須加載到RAM中!我不相信這個「​​都市傳奇」。 我的要點是:整個共享對象加載到RAM或只使用符號?

  1. gcc的鏈接器支持遲緩裝載
  2. 甲共享庫等的存儲器映射的文件來處理。因此,整個庫不會被加載到內存中,而只會被訪問時包含這些符號的部分。

我的假設是否正確,並且有人提到描述加載共享對象的文本(不是使用GOT進行符號解析,而是將「加載」到RAM中)?

非常感謝提前!

最好的問候 讓 - 皮埃爾·

回答

1

我的分數是:

gcc的鏈接器支持懶加載

有作爲 「GCC連接」 沒有這樣的事,和(靜)鏈接器與任何東西無關。

共享庫像內存映射文件一樣處理。因此,整個庫不會被加載到內存中,而只會被訪問時包含這些符號的部分。

這是正確的:Linux將要求從「磁盤」進行分頁,所以如果你的磁盤實際上是閃存,並且你不使用壓縮文件系統,並且你的共享庫沒有文本重定位(-Wl,-z,text),那麼只有來自庫的代碼和數據的引用部分將被分頁到RAM中。