2010-10-04 65 views
1

當我運行可執行文件後,我用新版本覆蓋了它的.so庫文件,這導致可執行文件因分段錯誤而死亡。我以爲只有在加載ELF文件時才能訪問庫文件。我錯了嗎?覆蓋庫文件導致分段錯誤

回答

9

庫文件在加載時映射到內存中(通常是在加載可執行文件時 - 但庫文件也可以稍後加載到dlopen())。然後根據需要加載需要的文件的實際頁面。

覆蓋該文件將導致映射文件MAP_SHARED(大部分文件)中的頁面被更新爲新內容。這是導致分段錯誤的原因。不要這樣做 - 相反,刪除現有的.so文件,然後在其位置編寫新文件。

2

與caf一樣,在運行時覆蓋可執行文件並不是一個好主意。

取而代之,將新文件作爲臨時文件寫入同一目錄,然後使用rename()以原子方式重命名它。這是安裝人員通常所做的。