Как уже упоминалось в разделе Почему программный пакет работает нормально, даже когда он обновляется? блокировка помещается в индекс, а не в имя файла. Когда вы загружаете и выполняете двоичный файл, файл помечается как занятый, поэтому вы получаете ошибку ETXTBSY (файл занят), когда пытаетесь записать в него файл.
Теперь для разделяемых библиотек это немного отличается: библиотеки отображают память в адресное пространство процесса с помощью mmap()
. Хотя это MAP_DENYWRITE
может быть указано, по крайней мере, Glibc в Linux молча игнорирует его (согласно справочной странице, не стесняйтесь проверять источники) - проверьте эту ветку . Следовательно, вам действительно разрешено записывать файл, и, поскольку он отображен в памяти, любые изменения видны почти сразу - это означает, что, если вы попытаетесь достаточно усердно, вам удастся сделать кирпич своей машины, перезаписав библиотеку.
Следовательно, правильный способ обновления:
удаление файла, который удаляет ссылку на данные из файловой системы, чтобы он был недоступен для новых приложений, которые могут его использовать, при этом данные остаются доступными для всех, у кого они уже открыты (или сопоставлены) ;
создание нового файла с обновленным содержимым.
Вновь созданные процессы будут использовать обновленное содержимое, запущенные приложения получат доступ к старой версии. Это то, что делает любая вменяемая утилита управления пакетами. Обратите внимание, что это не совсем безо всякой опасности - например, приложения, динамически загружающие код (использующие dlsym()
и друзья), будут испытывать проблемы, если API библиотеки будет изменяться в автоматическом режиме.
Если вы хотите быть действительно в безопасности, выключите систему, смонтируйте файловую систему из другого экземпляра операционной системы, обновите и снова запустите обновленную систему.
.so
файл, используяldd filename.so
для проверки зависимостей