Basicamente, isso se resume a: você não pode manter a compatibilidade binária e introduzir novos recursos , já que essas coisas vão diretamente umas contra as outras na maioria dos aspectos. Se você introduzir novos recursos importantes no final, precisará alterar a ABI (geralmente logo após as alterações na API). Agora, você pode ter símbolos versionados (como, por exemplo, o Glibc), mas isso faz com que as bibliotecas cresçam em tamanho (e também pode incorrer em alguma penalidade de desempenho ao carregar um binário na memória) e desenvolvedores certamente não querem mantê-lo em geral bibliotecas (o código legado contém erros que ninguém está interessado em consertar).
A maneira usual de contornar isso no lado da distribuição é dupla:
-
não altere versões - isso é típico para distribuições de nível empresarial como (em ordem alfabética) RedHat e SUSE, assim como para outras (Debian, Slackware, Ubunty LTS e provavelmente seus clones).
-
permite a instalação de várias versões de uma biblioteca ao mesmo tempo.
No distribuidor de aplicativos, isso é tratado da mesma forma que no Windows: armazena tudo o que é necessário no pacote de distribuição. Sim, é assim que muitas vezes é feito no Windows - essa também é uma das razões para o sistema Windows normalmente ter requisitos de espaço em disco muito maiores do que o Linux com a mesma funcionalidade - os aplicativos simplesmente compartilham muito pouco entre si e tem suas próprias cópias em algum lugar. Você pode pensar nisso como em toda aplicação GTK / Qt que vem com sua própria pilha GTK / Qt. Pode ter algumas vantagens, mas as desvantagens também são abundantes. Por exemplo, do ponto de vista da segurança, é um pesadelo em Technicolor TM . Se os binários estão estaticamente ligados, é mesmo em FullHD.