我正在運行一個小型的嵌入式linux系統,我的應用程序使用了一大堆動態鏈接庫(* .SO文件)。linux上的動態鏈接庫
我試圖節省磁盤空間,所以我想我可以將所有.SO文件壓縮成一個壓縮的zip文件。
然後,當應用程序啓動時,我將解壓縮所有.SO文件,然後使用dlopenext C函數打開它們,然後在打開它們之後將它們全部刪除,因爲靜態庫現在將存儲在內存中?
從磁盤中刪除* SO文件後,我是否仍然能夠在靜態庫中查找和調用函數,它現在應該在內存中嗎?
任何想法?
我正在運行一個小型的嵌入式linux系統,我的應用程序使用了一大堆動態鏈接庫(* .SO文件)。linux上的動態鏈接庫
我試圖節省磁盤空間,所以我想我可以將所有.SO文件壓縮成一個壓縮的zip文件。
然後,當應用程序啓動時,我將解壓縮所有.SO文件,然後使用dlopenext C函數打開它們,然後在打開它們之後將它們全部刪除,因爲靜態庫現在將存儲在內存中?
從磁盤中刪除* SO文件後,我是否仍然能夠在靜態庫中查找和調用函數,它現在應該在內存中嗎?
任何想法?
在大多數* ix實現中,文件系統上存在一個文件,直到沒有更多的開放引用或鏈接指向它爲止。因此,在刪除文件時可能會使其看起來消失(不會顯示在ls
中),這可能並不意味着磁盤空間已被釋放。
在Linux上,即使您從磁盤中刪除了某些內容,但如果某些內容具有打開的句柄,它也不會真正被刪除。它只會在句柄關閉時被刪除。
所以答案是肯定的和不是。是的,你可以刪除它們並繼續使用它們。不,它不會幫你節省空間。
您可以檢查UPX(http://upx.sourceforge.net)是否適用於您的目標平臺。它可能有助於降低磁盤大小。
減少代碼大小的另一種方法是靜態構建。如果這是你的情況的一個選項,那麼這將允許你做死代碼剝離。您將首先將每個庫構建爲一個靜態存檔,並使用以下代碼:
-fdata-sections -ffunction-sections
GCC選項。爲了您的最終可執行,你會使用這兩個選項加上此鏈接器選項:
-Wl,--gc-sections
同樣,這隻有真正建立靜態庫時幫助。動態庫不能被死代碼剝離(出於顯而易見的原因;目前還不知道你的可執行文件正在使用的庫的哪些部分)。
這樣做只適用於當前正在運行可執行文件的庫。不要靜態鏈接系統庫。
爲什麼不直接從壓縮文件系統運行?例如。 Squashfs的。 – tylerl
它已經在使用壁球了,但除壓縮磁盤空間以外,我還有其他的壓縮SO文件的原因。我想知道如果打開庫後,我現在可以從磁盤中刪除未壓縮的文件,它仍然會工作? –