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 abra identificadores para o arquivo. Quando você vai apagar um arquivo, você chama o unlink()
call - isso apaga o link ao arquivo (você também pode usar rename()
para sobrescrevê-lo com um inode diferente). No entanto, se os identificadores abertos do arquivo (ou outros links - arquivos puderem ter vários hardlinks ) permanecerem, o inode permanecerá, assim como o conteúdo do arquivo, até todos os links e alças vão embora.
Portanto, executar programas usando a biblioteca ou qualquer outra coisa mantém o controle da versão antiga (geralmente implicitamente através de um mapeamento de memória), para que ela permaneça no disco. Ele simplesmente não tem mais um nome de arquivo e será limpo quando todos os programas que o utilizam desligar (ou na próxima reinicialização, durante a verificação do sistema de arquivos ou a reprodução do diário).
Além disso, observe que os programas que esperam a 'biblioteca antiga' funcionarão bem com as versões mais novas 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 com uma versão mais antiga da libc, mas ainda uma versão da libc implementando a versão 6 da ABI, funcionará bem com ela. Programas realmente antigos procurarão por libc.so.5
ou libc.so.4
ou algo assim; Nesse caso, você também precisaria manter a versão antiga - mas como o nome do arquivo é diferente, isso não é um problema.