Como posso obter um compilador C estático?

8

Estou brincando com ambientes chroot e gostaria de ter um compilador C portátil para poder configurar facilmente algumas ferramentas básicas de construção em cada ambiente sem precisar mover muitas bibliotecas.

O Gcc parece bastante inchado pelo que eu quero fazer, mas se for razoavelmente fácil criar um gcc estático, não me importaria com algumas dezenas de megabytes.

Também estou olhando para o Tiny C Compiler, que é menor, mas ainda parece ter um conjunto impressionante de recursos. No entanto, a execução de ./configure --help no diretório de origem não lista nenhuma opção para criar o tcc estaticamente, e não tenho certeza de como isso poderia ser feito.

math4tots
fonte
Para responder à sua preocupação secundária, uso de memória, aqui estão algumas soluções: Você pode criar diretórios-sombra que contêm apenas links físicos para o GCC; É possível usar contêineres do docker (os contêineres são mais seguros que o chroot, e o docker fornece um sistema de arquivos da união, que permitirá economizar memória).
Ctrl-alt-delor

Respostas:

1

Construir um binário estático deve ser tão simples quanto executar o gcc com -static, ou se ld estiver sendo chamado diretamente, use -Bstatic. Tentar

CFLAGS=-static make

depois de correr configure. Se falhar, os resultados serão óbvios, por exemplo, várias referências indefinidas no tempo do link.

Kyle Jones
fonte
1
Eu tentei make CFLAGS=-staticagora. Faça impressões sobre algum aviso e dlopen, quando tento executar o executável no ambiente chroot, /usr/lib/crt1.o .. crti,o .. crtn.onão encontro erros. É isso que você quis dizer com "referências indefinidas no tempo do link"?
Math4tots
Os erros que eu esperava seriam devido à falta de versões estáticas das bibliotecas, como crt1.o, mas o vinculador reclamaria imediatamente. Se você estiver vendo os erros em tempo de execução, o binário não está estático.
Kyle Jones
Acho que você não entendeu a pergunta: math4tots quer um compilador C que funcione como um binário independente (ou pelo menos como um conjunto de arquivos facilmente identificável) e não um compilador C que produz binários independentes.
Gilles 'SO- stop be evil'
1
Sim eu entendo isso. Produzir um compilador estático é um primeiro passo necessário e que a pergunta parece estar se perguntando.
Kyle Jones
1
@Gilles A melhor maneira de obter um compilador C como um binário independente é construí-lo a partir da fonte usando um complier que você já possui.
OrangeDog
3

Você também pode recuperar uma versão pré-compilada com static-get

static-get -x gcc
Javier López
fonte