Bahsedildiği üzere Why çalıştırmak bir yazılım paketi sadece iyi o yükseltiliyor bile zaman? , kilit dosya adına değil inode üzerine yerleştirilir. Bir ikili dosyayı yükleyip yürüttüğünüzde, dosya meşgul olarak işaretlenir - bu nedenle yazmaya çalıştığınızda ETXTBSY (dosya meşgul) hatası alırsınız.
Şimdi, paylaşılan kütüphaneler için biraz farklıdır: kütüphaneler, hafızayı işlemin adres alanına eşleştirilir mmap()
. MAP_DENYWRITE
Belirtilebilir olsa da, Linux'ta en azından Glibc sessizce yok sayar (man sayfasına göre, kaynakları kontrol etmekten çekinmeyin) - bu konuyu kontrol edin . Bu nedenle, aslında dosyayı yazmanıza izin verilir ve bellek eşlemeli olduğu için, herhangi bir değişiklik hemen görülebilir - bu da yeterince denerseniz kitaplığınızın üzerine yazarak makinenizi tuğlalamayı başarabileceğiniz anlamına gelir .
Bu nedenle güncellemenin doğru yolu:
Verileri referanstan kaldıran dosya sisteminden kaldırılır, böylece onu kullanmak isteyebilecek yeni ortaya çıkan uygulamalar için erişilebilir olmazken, verileri zaten açık (veya eşlenmiş) olan herkes için erişilebilir tutar ;
güncellenmiş içeriğe sahip yeni bir dosya oluşturmak.
Yeni oluşturulan süreçler güncellenmiş içeriği kullanacak, çalışan uygulamalar eski sürüme erişecektir. Herhangi bir aklı başında paket yönetim yardımcı programı budur. Yine de tamamen tehlikesiz olmadığını unutmayın - örneğin, kodu dinamik olarak yükleyen uygulamalar ( dlsym()
ve arkadaşları kullanarak ), kütüphanenin API'sı sessiz bir şekilde değişirse sorun yaşayacaktır.
Gerçekten, gerçekten güvenli tarafta olmak istiyorsanız , sistemi kapatın, dosya sistemini başka bir işletim sistemi örneğinden bağlayın , güncelleyin ve güncellenen sistemi tekrar açın.
.so
kullanarak dosyayı kontrol edebilirsinizldd filename.so