Não entendo por que um binário construído em 21.10 não é compatível com um sistema 21.04.
O binário está vinculado ao libc.so.6
qual também está disponível na versão 21.04 do sistema operacional.
Mesmo binário, no sistema 21.10:
$ ldd turboledzd
linux-vdso.so.1 (0x00007ffdc2595000)
libhidapi-hidraw.so.0 => /lib/x86_64-linux-gnu/libhidapi-hidraw.so.0 (0x00007fdd64057000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdd63e2f000)
libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007fdd63e06000)
/lib64/ld-linux-x86-64.so.2 (0x00007fdd64085000)
E no sistema 21.04:
$ ldd turboledzd
./turboledzd: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by ./turboledzd)
linux-vdso.so.1 (0x00007fff9c570000)
libhidapi-hidraw.so.0 => /lib/x86_64-linux-gnu/libhidapi-hidraw.so.0 (0x00007f37ec402000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f37ec216000)
libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007f37ec1ed000)
/lib64/ld-linux-x86-64.so.2 (0x00007f37ec423000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f37ec1cb000)
Minha pergunta:
Se libc.so.6
a partir de 21.04 não for compatível com a libc.so.6
partir de 21.10, por que a libc em 21.10 libc.so.7
não é chamada?
Ou, melhor, por que não está vinculado a algo chamado libglibc.so.2.34
- se isso é uma dependência?
libc.so
é uma biblioteca tão essencial quanto possível. Quase tudo depende disso. Um dos objetivos da glibc é fornecer compatibilidade com versões anteriores - um programa que pode ser executado com uma versão mais antigalibc.so.6
deve (geralmente) também funcionar bem com uma versão mais recente. No entanto, se você aumentar o sonamelibc.so.7
apenas porque adicionou alguma nova função, todos esses programas criados anteriormente precisarão de uma reconstrução sem um bom motivo. Ainda não houve uma grande quebra na API da glibc para garantir isso ainda.Não vejo ninguém garantindo compatibilidade com versões futuras (que era o que você esperava até 21.04 ser capaz de executar algo a partir de 21.10) - por que você esperaria isso se não tomar precauções para garantir isso?
De acordo com packages.ubuntu.com , 21.04 usa glibc 2.33, enquanto 21.10 usa glibc 2.34, que não é completamente compatível.
No entanto, você deve poder criar binários para o Ubuntu 21.04 a partir do código-fonte.
A menos que a fonte seja interpretada, você geralmente precisa construir pacotes binários separadamente para diferentes versões do Ubuntu. O Launchpad pode automatizar isso para você.
Essa é uma decisão que apenas os desenvolvedores da glibc podem tomar.
O termo para o Google é "versão de símbolo glibc".
Como esta introdução explica, a glibc contém várias versões de cada símbolo que mudou ao longo do tempo e, portanto,
libc.so.6
contém todas as versões da glibc desde 2.0 até qualquer versão que ela diga.Ao vincular uma nova biblioteca ou binário a ela, você está usando os
.h
arquivos e símbolos exportados para as versões mais recentes dos símbolos.Quanto ao acesso aos símbolos mais antigos, há uma pergunta no StackOverflow chamada Como posso vincular a uma versão específica da glibc? , mas como todas as suas outras dependências provavelmente estarão vinculadas aos símbolos mais recentes também, é muito mais fácil usar o Docker ou um chroot para direcionar as versões mais antigas do sistema, porque você provavelmente acabará construindo uma do zero se não o fizer.
Os desenvolvedores Python realmente mantêm contêineres Docker nomeados
manylinux...
especificamente para estabelecer uma linha de base confiável para construir rodas (pacotes binários redistribuíveis) para pacotes Python com componentes compilados.Acredito que a abordagem do Windows esteja mais próxima de agrupar vários perfis claramente definidos e instar todos os autores de bibliotecas pré-compiladas a oferecer compilações direcionadas a perfis mais antigos. (Com a ressalva de que você deve assumir que o material deve ser
free
d pela mesma unidademalloc
de compilação que o fez porque o PE não possui símbolos globais e bibliotecas diferentes podem depender de diferentes versões do alocador com suas própriasstatic
variáveis e diferenças semânticas. )