Como instalar uma versão específica do GCC no Kali Linux?

8

Esta questão parece ter sido resolvida adequadamente em várias perguntas e em outros lugares facilmente encontrados no Google, mas não acho a solução satisfatória pelos motivos explicados abaixo. Mas apenas para conclusão, incluí alguns links relevantes:

/ubuntu/138284/how-to-downgrade-a-package-via-apt-get /ubuntu/428772/how-to-install-specific-version-of -alguns-package / 428.778 /ubuntu/26498/choose-gcc-and-g-version ...

E outros.

No entanto, esta pergunta é sobre a instalação de uma versão muito específica do GCC no Kali Linux, que não parece 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 programa específico: 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 em particular sem usar uma versão diferente do GCC, fique à vontade para responder, mas acredito que essa pergunta é geral e eu gostaria de saber como fazer isso independentemente de 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 anterior 4: 4.9.2-2, simplesmente (acredito) substituindo 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 contribao meu /etc/apt/sources.listarquivo e, em seguida, executar apt-get update.

No entanto, e se a versão necessária não estiver listada?

Eu tenho experimentado várias fontes, por exemplo, as encontradas aqui: http://snapshot.debian.org/ e em várias outras perguntas e sites das pesquisas do Google.

A maioria deles me ignora ou com erros, por exemplo, a seguir

Ign:3 http://snapshot.debian.org/archive/debian/20091004T111800Z lenny InRelease

Mesmo que isso funcione, parece ser uma abordagem muito ruim instalar uma versão específica, pois adicionar uma fonte arbitrária pode não ter a versão específica que eu quero.

Se eu procuro gcc no snapshot.debian.org, recebo apenas versões muito antigas: http://snapshot.debian.org/package/gcc/

Por fim, fiquei 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 deparo com a instalação. Eu sou cauteloso sobre a execução make installcomo eu temo que irá mexer com apte dpkge possivelmente quebrar 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 no meu PATH, o que não funcionou. Em seguida, tentei renomear /usr/bin/gcce fazer um link simbólico de /usr/bin/gcconde meu executável gcc-6.3.0 vive. 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, eu recebo este erro:

/usr/include/stdio.h:34:21: fatal error: stddef.h: No such file or directory

O que eu assumo é por causa de uma entrada ausente /usr/lib/gcc/x86_64-linux-gnu. Tentei fazer um link simbólico de 6 a 6.3.0, mas isso não foi suficiente. Eu também tentei copiar tudo com o cp -Rmesmo resultado.

Este deve ser um programa de 64 bits, mas também considerei o mesmo /usr/lib/gcc/i686-linux-gnu.

Tenho certeza de que poderia começar a fazer stracepara ver de onde ele tenta abrir os arquivos, ler os 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ã.

AlphaCentauri
fonte
Isso não diminui os méritos gerais da sua pergunta; mas as versões atuais do XMRig devem ser bem construídas com o GCC 7, portanto você deve poder construí-lo sem mexer no GCC 6.3.
Stephen Kitt
Você sempre pode compilar o GCC (qualquer versão não muito antiga) a partir do código fonte , pois é um software livre. Tenha cuidado ao configurá-lo e construa-o fora de sua árvore de origem.
Basile Starynkevitch

Respostas:

10

Como instalar uma versão específica do GCC no Kali Linux?

O GCC 6 está disponível no kali linux e pode ser instalado da seguinte forma:

apt install g++-6 gcc-6

Para alternar entre gcc6 e gcc7

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 1 --slave /usr/bin/g++ g++ /usr/bin/g++-7
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 2 --slave /usr/bin/g++ g++ /usr/bin/g++-6
update-alternatives --config gcc

saída de amostra:

There are 2 choices for the alternative gcc (providing /usr/bin/gcc).

  Selection    Path            Priority   Status
------------------------------------------------------------
* 0            /usr/bin/gcc-6   2         auto mode
  1            /usr/bin/gcc-6   2         manual mode
  2            /usr/bin/gcc-7   1         manual mode

Press <enter> to keep the current choice[*], or type selection number:

Selecione sua gccversão padrão .

em 05/08/2017, a versão gcc-6 é atualizada de 6.3.0para 6.4.0.

Instalando xmrigseguindo as instruções da construção .

apt-get install git build-essential cmake libuv1-dev libmicrohttpd-dev
git clone https://github.com/xmrig/xmrig.git
cd xmrig
mkdir build
cd build
cmake ..
make

Criando uma versão específica do gcc 6.3.0

Faça o download do tarball do espelho mais próximo : Versões do GCC

wget https://ftp.gnu.org/gnu/gcc/gcc-6.3.0/gcc-6.3.0.tar.bz2
tar xvf gcc-6.3.0.tar.gz
cd gcc-6.3.0
apt build-dep gcc
./contrib/download_prerequisites
cd ..
mkdir objdir
cd objdir
$PWD/../gcc-6.3.0/configure --prefix=/usr/bin/gcc-6.3 --enable-languages=c,c++,fortran,go --disable-multilib
make -j 8
make install

Adicionar gcc-6.3aupdate-alternatives

Importante : A --disable-multilibopção é necessária para configurar e criar gcca arquitetura atual.

GCC WIKI: instalando o GCC

GAD3R
fonte
1
Desculpe-me, mas isso não instala qualquer versão do GCC que o "gcc-6" forneça? E se eu quiser instalar especificamente o 6.3.0?
AlphaCentauri
@AlphaCentauri Há 6 meses a versão disponível do gcc6 é 6.3.0, agora a versão do gcc6 foi atualizada para 6.4.0.
GAD3R
1
Resposta do @AlphaCentauri atualizada, incluindo as etapas de construção.
GAD3R
1
  1. Primeiro você precisa acessar este site: http://gcc.gnu.org/mirrors.html
  2. Em seguida, selecione versões antigas e você verá versões diferentes.
  3. Agora você deve clicar no que deseja e o download será iniciado.

  4. Finalmente, você deve compilar e instalar a partir da fonte: /ubuntu/25961/how-do-i-install-a-tar-gz-or-tar-bz2-file

Prashant Luhar
fonte
1
Obrigado, mas não acredito que você tenha lido toda a minha pergunta. Eu apontei como eu tentei compilar a partir da fonte. O problema com isso (como apontado na minha pergunta), é que fazer "make install" no GCC pode não ser uma boa idéia, pois pode possivelmente danificar o sistema. Além disso, simplesmente executar o GCC sem fazer make install apresenta seus próprios desafios, que também descrevi na minha pergunta original.
AlphaCentauri
Você declarou em sua pergunta que make installpode adulterar dpkgou apt.. você pode elaborar! @AlphaCentauri
Prashant Luhar
0

Se você criou um padrão ./configure; makesem passar nenhuma opção configure, make installcolocará as partes da versão desejada do GCC em vários subdiretórios de /usr/local.

A /usr/localárvore de diretórios é destinada 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 não quebrará o software empacotado, exceto em circunstâncias extremamente incomuns.

O GCC, em particular, foi desenvolvido com base no pressuposto de que você terá várias versões instaladas. Exige praticamente medidas ativas de sua parte para quebrar qualquer coisa (por exemplo, misturando e combinando peças para tentar criar uma versão híbrida).

Marca
fonte
Você não deve (e provavelmente não conseguirá) criar o GCC em sua árvore de origem. E você provavelmente deseja opções adicionais para o seu configurescript (por exemplo, algumas -program-suffix=etc) #
Basile Starynkevitch 15/17 /
0

Por fim, fiquei frustrado com essa abordagem e compilei o GCC 6.3.0 a partir do tarball de origem. A compilação foi bem sucedida,

Primeiro, eu recomendaria, se você compilar o GCC a partir da fonte, escolher uma versão mais recente (por exemplo, o GCC 7 no final de 2017).

Em seguida, certifique-se de criar o GCC fora de sua árvore de origem e tentar primeiro seu configurescript com --helpe passar mais opções para eleconfigure . 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 -vpara entender como o GCC do seu sistema foi configurado

  • executar apt-get build-dep gcc-6(ou similar) para obter as dependências recentes do GCC do sistema

  • crie um diretório de construção fora da sua árvore de origem do GCC e execute mais adiante .../configure(substitua ...pelo caminho relativo apropriado, por exemplo ../gcc-7.2/) e makelá.

  • você provavelmente deseja passar pelo menos --program-suffix=-minepara isso configure( -minepode ser substituído por outro sufixo) e pode até adicionar --prefix=$HOME/soft/se não tiver acesso root. Você provavelmente vai querer opções adicionais para configuree você precisa escolher e dar-lhes atenção.

  • então um mais tarde make install(você pode até rodar sem ser root make install DESTDIR=/tmp/gccinst/e depois copiar cuidadosa e recursivamente como root que /tmp/gccinst/....) instalaria coisas em /usr/local/bin/gcc-mineetc .... (ou $HOME/soft/bin/gcc-mine....) para não quebrar nenhum arquivo instalado no sistema .

Observe que o ESF exige que o sistema de gerenciamento de pacotes seja deixado em paz /usr/local/(que é o padrão --prefixpara os GCCs configure)

Basile Starynkevitch
fonte
O OP já possui o GCC 7, mas estava procurando pela 6.3.0 após um comentário errado no reddit.
Stephen Kitt
0

Você também pode usar uma cadeia de ferramentas pré-compilada ou essa para sua arquitetura específica (x86_64, glibc, gcc 6.3).

Obviamente, 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.

Christian Stenzel
fonte