Wie in erwähnt Warum funktioniert ein Softwarepaket auch während eines Upgrades einwandfrei? Befindet sich die Sperre auf Inode, nicht auf Dateiname. Wenn Sie eine Binärdatei laden und ausführen, wird die Datei als beschäftigt markiert. Aus diesem Grund wird beim Versuch, darauf zu schreiben, der ETXTBSY-Fehler (Datei besetzt) angezeigt.
Für gemeinsam genutzte Bibliotheken ist dies etwas anders: Die Bibliotheken erhalten Speicher, der in den Adressraum des Prozesses mit abgebildet wird mmap()
. Obwohl MAP_DENYWRITE
dies spezifiziert sein mag, ignoriert zumindest Glibc unter Linux es unbemerkt (laut Manpage können Sie die Quellen überprüfen) - überprüfen Sie diesen Thread . Daher dürfen Sie die Datei tatsächlich schreiben, und da sie im Arbeitsspeicher abgelegt ist, sind alle Änderungen fast sofort sichtbar. Wenn Sie sich also anstrengen, können Sie es schaffen, Ziegel zu bauen Ihre Maschine durch die Bibliothek zu überschreiben.
Der richtige Weg zur Aktualisierung ist daher:
Entfernen der Datei, wodurch der Verweis auf die Daten aus dem Dateisystem entfernt wird, sodass für neu erstellte Anwendungen, die sie möglicherweise verwenden möchten, kein Zugriff darauf möglich ist, während die Daten für alle Personen zugänglich bleiben, die sie bereits geöffnet (oder zugeordnet) haben. ;
Erstellen einer neuen Datei mit aktualisierten Inhalten.
Neu erstellte Prozesse verwenden die aktualisierten Inhalte, laufende Anwendungen greifen auf die alte Version zu. Dies ist, was jedes vernünftige Paketverwaltungsdienstprogramm tut. Beachten Sie jedoch, dass dies nicht völlig ungefährlich ist. Beispielsweise treten bei Anwendungen, die Code dynamisch laden (mithilfe von dlsym()
und Freunden), Probleme auf, wenn sich die API der Bibliothek unbemerkt ändert.
Wenn Sie wirklich auf der sicheren Seite sein möchten , fahren Sie das System herunter, hängen Sie das Dateisystem von einer anderen Betriebssysteminstanz aus an, aktualisieren Sie das aktualisierte System und rufen Sie es erneut auf.
.so
Datei mitldd filename.so
überprüfen, um Abhängigkeiten zu überprüfen