Suponha que eu tenha um programa que depende de uma versão glibc mais recente que não está disponível no sistema por meio de pacotes. E dá:
version `GLIBC_2.xxx' not found
Uma solução é compilar o binário com glibc estaticamente.
A outra solução que é descartada por muitas pessoas como "não segura" é colocar mais recente libc.so.6
em vez da fornecida pelo sistema operacional.
Como exatamente essa segunda solução não é segura ou uma má ideia, desde que libc.so.6
inclua endpoints ABI anteriores?
Por exemplo, se eu executar strings /usr/lib/libc.so.6 | grep --perl-regexp "^GLIBC_"
, posso ver muitas dessas versões da ABI como:
...
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_2.17
...
Portanto, se estou substituindo por um mais recente libc.so.6
com versões glibc ABI adicionais dentro dele, como ele quebra aplicativos mais antigos ou leva o sistema à quebra?
Ou não...? :)
Em geral, os binários que foram compilados para uma versão glibc mais antiga funcionarão bem em um sistema com uma glibc mais recente, pois a glibc é compatível com versões anteriores e lida automaticamente com alterações em sua interface binária de aplicativo (ABI) . Ele consegue essa magia usando o versionamento de símbolos, onde basicamente a cada símbolo é anexada uma tag especificando sua versão glibc.
No caso de mudanças semânticas nas chamadas de funções, a glibc incluirá duas versões, uma para a semântica antiga e outra para a nova semântica, de modo que cada função é marcada com sua versão. O vinculador considerará ambas as versões como duas funções distintas.
Esse mecanismo sofisticado é necessário, pois a glibc não é um arquivo, mas consiste em várias partes (mais de 200 bibliotecas compartilhadas).
A compatibilidade com versões anteriores da glibc está sob rastreamento constante. Você pode consultar o relatório do Laboratório ABI para revisão de alterações API/ABI para glibc . O relatório é gerado pelas ferramentas abi-compliance-checker e abi-tracker .
Para sua pergunta:
A compatibilidade com Glibc não é infalível, mas acredito que você terá que voltar aos produtos compilados em versões bastante antigas do Linux para quebrá-la. Eu também diria que os produtos podem quebrar não apenas por causa do glibc quando executados em versões do Linux diferentes de onde foram compilados.
Portanto, a melhor resposta que posso dar é:
"Não é para quebrar nada e há uma excelente chance de que não quebre".
Para mais informações, veja:
A resposta direta à sua pergunta é que, se você usar a versão mais recente (não necessariamente suportada). Você não tem garantia de que uma função não foi removida ou alterada de forma que seus outros aplicativos (mais antigos) sejam capazes de lidar com essas alterações. Na verdade, eles não serão capazes de lidar com sua nova versão, se sua nova versão não fornecer "correções" para suportar as chamadas funções "legadas" que foram removidas ou alteradas de forma incompatível .
Portanto, se você espera sucesso em seu empreendimento, precisará examinar a
Changelog(s)
versão Glibc "suportada" a seguir. Para determinar com segurança o que mudou . :)