Construindo programas “cross linux system”, com diferentes intérpretes libc / musl

0

Meu objetivo é simples: eu gostaria de criar um programa que inicialize o gerenciador de pacotes nix em qualquer arquitetura, como um usuário não-root, com o menor número possível. Por enquanto, o que fiz foi o seguinte: eu baixei no host uma versão alpina minimalista, com o bom arco. Então eu o descompactei e "chroot" (na verdade proot) nele. Então, eu instalo (no chroot) todos os deps para o build, eu o construo com as boas opções, e então copio de volta os arquivos no host.

Mas há um problema importante: cada sistema parece ter o "arquivo de intérprete" (o que você obtém quando você executa file nele) em um lugar diferente: no meu debian está em /lib64/ld-linux-x86-64.so.2 , mas em alpino está em /lib/ld-musl-x86_64.so.1 . Então, quando eu executo, recebo um erro como File does not exists (embora obviamente exista).

Então aqui está a minha pergunta: como eu posso compilar uma ferramenta (como o nix), de modo que o intérprete seja encontrado em todas (ou pelo menos na maioria) das distribuições linux? E se não for possível, posso, de alguma forma, fazer chroot / proot em um sistema e usar o interpretador de host, de modo que, quando eu copiar os arquivos no host, o interpretador se torne o bom?

Obrigado!

    
por tobiasBora 14.03.2018 / 15:50

1 resposta

1

Existem três maneiras de lidar com esse tipo de problema.

  1. Você pode criar nix estaticamente; então, não precisará de um vinculador dinâmico em tempo de execução e funcionará praticamente em qualquer lugar. (Isso também lida bem com problemas de compatibilidade de bibliotecas.)

  2. Você pode construir nix várias vezes, uma vez por libc alvo - realisticamente, no Linux, GNU libc e musl ( talvez dietlibc também). Isso lhe dará binários que você pode usar conforme apropriado, dependendo da libc do ambiente de destino. Eu não sei sobre o Alpine Linux, mas isso é possível, por exemplo, no Debian; você cria usando o compilador padrão para criar com o GNU libc e instala o pacote musl-dev e compila com musl-gcc para o alvo.

  3. Você pode especificar as dependências de qualquer binário que você faça decidir construir e instalá-las no ambiente de destino. Por exemplo, um binário baseado em musl baseado no Alpine será mais fácil de executar em um derivado Debian se você instalar o pacote musl lá.

por 14.03.2018 / 16:57