O Linux (e outros UNIXes) faz uma distinção entre o nome de um arquivo (o link ), o próprio arquivo (geralmente identificado com o inode ) e os identificadores abertos para o arquivo. Ao excluir um arquivo, você faz a unlink()
ligação - isso apaga o link para o arquivo (você também pode rename()
substituí-lo por um inode diferente). No entanto, se os identificadores abertos para o arquivo (ou outros links - os arquivos podem ter vários links físicos ), o inode permanece e o conteúdo do arquivo permanece, até que todos os links e identificadores desapareçam.
Portanto, a execução de programas usando a biblioteca ou qualquer outra forma mantém a versão antiga (geralmente implicitamente por meio de um mapeamento de memória), para que ela permaneça no disco. Ele simplesmente não possui mais um nome de arquivo e será limpo quando todos os programas que o utilizarem forem desligados (ou na próxima reinicialização, durante a verificação do sistema de arquivos ou a repetição do diário).
Além disso, observe que os programas que esperam a 'biblioteca antiga' se sairão bem com as versões mais recentes da biblioteca. As bibliotecas Linux recebem um nome de arquivo ('soname') que reflete a versão da ABI (Application Binary Interface) oferecida pela biblioteca. Por exemplo, a biblioteca C no meu sistema é libc.so.6
. Qualquer programa compilado em uma versão mais antiga da libc, mas ainda assim uma versão da libc que implementa a ABI da versão 6, funcionará bem com ele. Programas realmente antigos procurarão um libc.so.5
ou libc.so.4
ou algo; nesse caso, você também precisará manter a versão antiga - mas como o nome do arquivo é diferente, isso não é um problema.