Upgrade
是否有在庫升級期間保護應用程序的機制?
如果使用者在動態連結的應用程序上工作,並且系統正在升級,是否有任何保護機制可以防止應用程序損壞?
還是取決於申請?
正如@Kusalananda 所提到的,通常升級是通過刪除舊文件並創建一個具有相同名稱的新文件來完成的。這實際上會創建一個帶有新 inode 的新文件,只要舊文件處於打開狀態,系統就可以自由使用它。
作為一個簡化的例子,像
rm /bin/cat cp /new/version/of/cat /bin/cat
將創建一個邏輯上的新文件,並且即使
cat
可能正在執行也可以工作。圖書館也是如此。(上面是一個例子,不是在現實世界中升級文件的可靠方法。)有人可以嘗試就地更改二進製文件,而不是創建一個具有相同名稱的新文件。在這種情況下,至少 Linux 實際上會阻止對正在使用的執行檔進行更改:
window 1 # ./cat window 2 # echo foobar > cat -bash: cat: Text file busy
但是,這似乎不適用於動態載入的庫……
我製作了一份
libc.so.6
用於測試的副本,並在使用時用零填充:window 1 /tmp/lib# LD_LIBRARY_PATH=/tmp/lib ldd ./cat linux-vdso.so.1 (0x00007ffcfaf30000) libc.so.6 => /tmp/lib/libc.so.6 (0x00007f1145e67000) /lib64/ld-linux-x86-64.so.2 (0x00007f1146212000) window 1 /tmp/lib# LD_LIBRARY_PATH=/tmp/lib ./cat foo foo Segmentation fault
(同時在另一個視窗中,在 segfault 之後
foo
,在 segfault 之前)window 2 /tmp/lib# dd if=/dev/zero of=libc.so.6 bs=1024 count=2000
程序本身確實對此無能為力,因為我有效地線上編輯了它的程式碼。
(這可能取決於系統,我在 Debian Jessie 8.5、Linux 3.16.7-ckt25-2+deb8u3 上進行了測試。尤其是 IIRC Windows 系統更積極地防止正在使用的文件被修改。)
所以我想答案是升級通常以避免任何問題的方式完成,這得益於文件系統內部。但是(在 Linux 上)似乎沒有任何保護措施可以防止實際破壞動態庫。