Esta questão parece ser abordada adequadamente em várias perguntas e outros locais facilmente encontrados no Google, mas não considero a solução satisfatória pelos motivos explicados abaixo. Mas apenas para completar, incluí alguns links relevantes:
https://askubuntu.com/questions/138284/how-to-downgrade-a-package-via-apt-get https://askubuntu.com/questions/428772/how-to-install-specific-version-of -some-package/428778 https://askubuntu.com/questions/26498/choose-gcc-and-g-version ...
E outros.
No entanto, esta questão é sobre a instalação de uma versão muito específica do GCC no Kali Linux, que não aparece prontamente disponível como um pacote específico. Em particular, a questão é sobre como instalar a versão 6.3.0, pois preciso dessa versão para compilar um determinado programa: https://www.reddit.com/r/Monero/comments/6d0ah8/xmrig_miner_new_release/
(como uma pergunta bônus, se houver uma maneira mais sensata de corrigir esse problema específico sem usar uma versão diferente do GCC, fique à vontade para responder, mas acredito que essa pergunta seja geral e gostaria de saber como fazer isso independentemente como fazer o link do programa mencionado corretamente)
As versões disponíveis para instalação de qualquer pacote, por exemplo, gcc, podem ser determinadas com:
apt-cache showpkg gcc
Que listará as versões disponíveis em "versões:", por exemplo
4:7.2.0-1d1
4:4.9.2-2
A instalação é tão simples quanto emitir
apt-get install gcc:4:4.9.2-2
Isso instalará a versão mais antiga 4:4.9.2-2, simplesmente (acredito) sobrescrevendo a instalação 7.2.0-1d1, se presente.
Para obter a versão 4:4.9.2-2 disponível, tive que adicionar deb
http://old.kali.org/kali sana main non-free contrib
ao meu
/etc/apt/sources.list
arquivo e executar apt-get update
.
No entanto, e se a versão de que preciso não estiver listada?
Tenho experimentado várias fontes, por exemplo, as encontradas aqui: http://snapshot.debian.org/ e em várias outras perguntas e sites de pesquisas do Google.
A maioria deles me ignora ou erros, por exemplo, da seguinte forma
Ign:3 http://snapshot.debian.org/archive/debian/20091004T111800Z lenny InRelease
Mesmo que isso funcione, parece ser uma abordagem muito ruim para instalar uma versão específica, pois adicionar alguma fonte arbitrária pode não ter a versão específica que eu desejo.
Se eu pesquisar em snapshot.debian.org por gcc, obtenho apenas versões muito antigas: http://snapshot.debian.org/package/gcc/
Acabei ficando frustrado com essa abordagem e compilei o GCC 6.3.0 a partir do tarball de origem. A compilação foi bem-sucedida, mas depois me deparei com como instalá-la. Sou cauteloso ao executar make install
, pois temo que isso adultere apt
e dpkg
possivelmente quebre o sistema.
Em vez disso, tentei executá-lo diretamente do diretório de compilação. Tentei simplesmente adicionar o diretório de compilação como a primeira entrada em meu PATH, o que não funcionou. Em seguida, tentei renomear /usr/bin/gcc
e fazer um link simbólico de /usr/bin/gcc
onde meu executável gcc-6.3.0 está. Isso apresenta o seguinte problema:
cc: error trying to exec 'cc1': execvp: No such file or directory, which
Isso foi corrigido com outra entrada no meu PATH.
Então, recebo este erro:
/usr/include/stdio.h:34:21: fatal error: stddef.h: No such file or directory
O que eu suponho é por causa de uma entrada ausente em /usr/lib/gcc/x86_64-linux-gnu
. Tentei fazer um link simbólico de 6 para 6.3.0, mas não foi suficiente. Eu também tentei copiar tudo com o cp -R
mesmo resultado.
Este deve ser um programa de 64 bits, mas também considerei o mesmo para
/usr/lib/gcc/i686-linux-gnu
.
Tenho certeza de que poderia começar strace
a ver de onde ele tenta abrir os arquivos, ler arquivos de log, ler a fonte e, eventualmente, imagino que seria capaz de descobrir como hackear uma solução mal concebida. Mas seria bom se alguém pudesse me dizer como fazer isso de maneira sã.
O GCC 6 está disponível no kali linux e pode ser instalado da seguinte maneira:
Para alternar entre gcc6 e gcc7
Exemplo de saída:
Selecione sua versão padrão
gcc
.em 05/08/2017, a versão gcc-6 foi atualizada de
6.3.0
para6.4.0
.Construindo uma versão específica do gcc
6.3.0
Baixe o tarball do espelho mais próximo : GCC Releases
Adicionar
gcc-6.3
aupdate-alternatives
Importante : A
--disable-multilib
opção é necessária para configurar e construirgcc
para a arquitetura atual.GCC WIKI: Instalando o GCC
Agora você deve clicar naquele que deseja ter e o download será iniciado.
Finalmente, você deve compilar e instalar a partir da fonte: https://askubuntu.com/questions/25961/how-do-i-install-a-tar-gz-or-tar-bz2-file
Se você fez um padrão
./configure; make
sem passar nenhuma opção paraconfigure
, entãomake install
colocará as peças de sua versão desejada do GCC em vários subdiretórios de/usr/local
.A
/usr/local
árvore de diretórios destina-se ao software instalado pelo administrador do sistema fora do sistema de gerenciamento de pacotes (ou seja, exatamente o que você está fazendo). Como tal, o software instalado lá não quebrará o software empacotado, exceto em circunstâncias extremamente incomuns.O GCC, em particular, foi projetado com base na suposição de que você terá várias versões instaladas. Requer medidas ativas de sua parte para quebrar qualquer coisa (por exemplo, misturando e combinando peças para tentar criar uma versão híbrida).
Primeiro, eu recomendaria, se você compilar o GCC de sua fonte, escolher uma versão mais recente (por exemplo , GCC 7 no final de 2017).
Em seguida, certifique-se de construir o GCC fora de sua árvore de origem e tente primeiro seu
configure
script com--help
e passar mais opções para seu arquivoconfigure
. Leia atentamente as instruções de instalação do GCC e entenda o papel do autoconf .Na prática, eu recomendo
execute
/usr/bin/gcc -v
para entender como o GCC do seu sistema foi configuradorun
apt-get build-dep gcc-6
(ou similar) para obter as dependências GCC do sistema recentecrie um diretório de compilação fora de sua árvore de origem GCC e execute mais
.../configure
(substitua...
pelo caminho relativo apropriado, por exemplo../gcc-7.2/
) emake
lá.você provavelmente deseja passar pelo menos
--program-suffix=-mine
para issoconfigure
(o-mine
pode ser substituído por outro sufixo) e pode até adicionar--prefix=$HOME/soft/
se não tiver acesso root. Você provavelmente desejará opções adicionais econfigure
precisará escolhê-las e fornecê-las com cuidado.em seguida, um posterior
make install
(você pode até executar sem ser rootmake install DESTDIR=/tmp/gccinst/
e depois copiar com cuidado e recursivamente como root que/tmp/gccinst/
....) instalaria coisas em/usr/local/bin/gcc-mine
etc .... (ou$HOME/soft/bin/gcc-mine
....) para não quebrar nenhum arquivo instalado no sistema .Observe que o FHS requer que o sistema de gerenciamento de pacotes saia sozinho
/usr/local/
(que é o padrão--prefix
para GCC'sconfigure
)Você também pode usar uma cadeia de ferramentas pré-compilada ou esta para sua arquitetura específica (x86_64, glibc, gcc 6.3).
É claro que a próxima opção é usar o chamado rootfs-builder como buildroot ou yocto
para gerar uma cadeia de ferramentas com sua versão específica do gcc.