Conforme mencionado em Por que um pacote de software funciona bem mesmo quando está sendo atualizado? , o bloqueio é colocado no inode e não no nome do arquivo. Quando você carrega e executa um binário, o arquivo é marcado como ocupado - e é por isso que você recebe o erro ETXTBSY (arquivo ocupado) ao tentar gravar nele.
Agora, para bibliotecas compartilhadas, é um pouco diferente: as bibliotecas são mapeadas na memória no espaço de endereço do processo mmap()
. Embora MAP_DENYWRITE
possa ser especificado, pelo menos o Glibc no Linux o ignora silenciosamente (de acordo com a página do manual, fique à vontade para verificar as fontes) - verifique este tópico . Portanto, você tem permissão para gravar o arquivo e, como ele é mapeado na memória, quaisquer alterações são visíveis quase imediatamente - o que significa que, se você se esforçar o suficiente, poderá gerenciar a sua máquina em blocos substituindo a biblioteca.
A maneira correta de atualizar, portanto, é:
remover o arquivo, que remove a referência aos dados do sistema de arquivos, para que não fique acessível para aplicativos recém-gerados que possam querer usá-lo, mantendo os dados acessíveis para quem já os tem aberto (ou mapeado) ;
criando um novo arquivo com conteúdo atualizado.
Os processos criados recentemente usarão o conteúdo atualizado, os aplicativos em execução acessarão a versão antiga. É isso que qualquer utilitário de gerenciamento de pacotes sã faz. Observe que não é completamente sem perigo - por exemplo, aplicativos que carregam código dinamicamente (usando dlsym()
e amigos) terão problemas se a API da biblioteca mudar silenciosamente.
Se você deseja estar do lado realmente seguro, desligue o sistema, monte o sistema de arquivos a partir de outra instância do sistema operacional, atualize e abra o sistema atualizado novamente.
.so
arquivo usandoldd filename.so
a dependências de verificação