Comment installer une version spécifique de GCC dans Kali Linux?

8

Cette question semble être traitée correctement dans plusieurs questions et dans d'autres endroits faciles à trouver avec Google, mais je ne trouve pas la solution satisfaisante pour les raisons expliquées ci-dessous. Mais juste pour terminer, j'ai inclus quelques liens pertinents:

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

Et d'autres.

Cependant, cette question concerne l'installation d'une version très spécifique de GCC dans Kali Linux, qui ne semble pas facilement disponible en tant que package spécifique. En particulier, la question est de savoir comment installer la version 6.3.0, car j'ai besoin de cette version pour compiler un programme particulier: https://www.reddit.com/r/Monero/comments/6d0ah8/xmrig_miner_new_release/

(en tant que question bonus, s'il existe un moyen plus sensé de résoudre ce problème particulier sans utiliser une version différente de GCC, n'hésitez pas à répondre, mais je pense que cette question est générale et je voudrais savoir comment le faire indépendamment de comment faire correctement le lien du programme susmentionné)

Les versions disponibles pour l'installation de n'importe quel paquet, par exemple gcc, peuvent être déterminées avec:

apt-cache showpkg gcc

Qui listera les versions disponibles sous "versions:", par exemple

4:7.2.0-1d1
4:4.9.2-2

L'installation est alors aussi simple que l'émission

apt-get install gcc:4:4.9.2-2

Cela installera l'ancienne version 4: 4.9.2-2, en écrasant simplement (je crois) l'installation 7.2.0-1d1, si elle est présente.

Pour que la version 4: 4.9.2-2 soit disponible, j'ai dû ajouter deb http://old.kali.org/kali sana main non-free contribà mon /etc/apt/sources.listfichier, puis exécuter apt-get update.

Cependant, que se passe-t-il si la version dont j'ai besoin n'est pas répertoriée?

J'ai expérimenté différentes sources, par exemple celles trouvées ici: http://snapshot.debian.org/ et sur diverses autres questions et sites Web issus de recherches Google.

La plupart d'entre eux me donnent ignorer ou des erreurs, par exemple comme suit

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

Même si cela fonctionnait, il semble que ce soit une très mauvaise approche pour installer une version particulière, car l'ajout d'une source arbitraire pourrait ne pas avoir la version particulière que je veux.

Si je recherche gcc sur snapshot.debian.org, je n'obtiens que des versions très anciennes: http://snapshot.debian.org/package/gcc/

J'ai finalement été frustré par cette approche et j'ai compilé GCC 6.3.0 à partir de l'archive tar source. La compilation a été réussie, mais je me demande alors comment l'installer. Je suis prudent sur l' exécution make installque je crains qu'il ne falsifier aptet dpkget éventuellement briser le système.

Au lieu de cela, j'ai essayé de l'exécuter directement depuis le répertoire de génération. J'ai essayé d'ajouter simplement le répertoire de construction comme première entrée dans mon PATH, ce qui n'a pas fonctionné. Ensuite, j'ai tenté de renommer /usr/bin/gccet de créer un lien symbolique à partir /usr/bin/gccde l'emplacement de mon exécutable gcc-6.3.0. Cela présente le problème suivant:

cc: error trying to exec 'cc1': execvp: No such file or directory, which

Cela a été corrigé avec une autre entrée dans mon CHEMIN.

Ensuite, je reçois cette erreur:

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

Ce que je suppose est dû à une entrée manquante dans /usr/lib/gcc/x86_64-linux-gnu. J'ai essayé de créer un lien symbolique de 6 vers 6.3.0, mais ce n'était pas suffisant. J'ai aussi essayé de tout copier avec le cp -Rmême résultat.

Cela devrait être un programme 64 bits, mais j'ai également considéré la même chose pour /usr/lib/gcc/i686-linux-gnu.

Je suis sûr que je pourrais commencer straceà voir d'où il tente d'ouvrir les fichiers, lire les fichiers journaux, lire la source, et finalement j'imagine que je serais en mesure de comprendre comment pirater ensemble une solution mal conçue. Mais ce serait bien si quelqu'un pouvait me dire comment faire cela de manière saine.

Alpha Centauri
la source
Cela ne porte pas atteinte au bien-fondé général de votre question; mais les versions actuelles de XMRig devraient fonctionner correctement avec GCC 7, vous devriez donc être en mesure de le construire sans déconner avec GCC 6.3.
Stephen Kitt
Vous pouvez toujours compiler GCC (toute version pas trop ancienne) à partir de son code source , car il s'agit d'un logiciel libre. Soyez prudent lorsque vous le configurez et créez-le en dehors de son arborescence source.
Basile Starynkevitch

Réponses:

10

Comment installer une version spécifique de GCC dans Kali Linux?

GCC 6 est disponible sur kali linux, il peut être installé comme suit:

apt install g++-6 gcc-6

Pour basculer entre gcc6 et 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

exemple de sortie:

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:

Sélectionnez votre gccversion par défaut .

le 2017-08-05, la version gcc-6 est mise à niveau de 6.3.0à 6.4.0.

Installation en xmrigsuivant les instructions de la build .

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

Construire une version gcc spécifique 6.3.0

Téléchargez l'archive tar du miroir le plus proche : GCC Releases

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

Ajouter gcc-6.3àupdate-alternatives

Important : L' --disable-multiliboption est requise pour configurer et construire gccpour l'architecture actuelle.

GCC WIKI: Installation de GCC

GAD3R
la source
1
Pardonnez-moi, mais cela n'installe-t-il pas la version de GCC fournie par "gcc-6"? Que faire si je souhaite installer spécifiquement la version 6.3.0?
AlphaCentauri
@AlphaCentauri Il y a 6 mois, la version gcc6 disponible est 6.3.0, maintenant la version gcc6 est mise à niveau vers 6.4.0.
GAD3R
1
@AlphaCentauri réponse mise à jour, y compris les étapes de construction.
GAD3R
1
  1. Vous devez d'abord aller sur ce site: http://gcc.gnu.org/mirrors.html
  2. Sélectionnez ensuite les anciennes versions et vous verrez différentes versions.
  3. Maintenant, vous devez cliquer sur celui que vous souhaitez avoir et le téléchargement commencera.

  4. Enfin, vous devez compiler et installer à partir des sources: /ubuntu/25961/how-do-i-install-a-tar-gz-or-tar-bz2-file

Prashant Luhar
la source
1
Merci, mais je ne pense pas que vous ayez lu toute ma question. J'ai souligné comment j'ai tenté de compiler à partir des sources. Le problème avec cela (comme indiqué dans ma question), est que faire "make install" sur GCC peut ne pas être une bonne idée car cela pourrait éventuellement casser le système. De plus, exécuter simplement GCC sans faire make install présente ses propres défis, que j'ai également décrits dans ma question d'origine.
AlphaCentauri
Vous avez indiqué dans votre question qui make installpourrait altérer dpkgou apt.. pouvez-vous élaborer! @AlphaCentauri
Prashant Luhar
0

Si vous avez fait un standard ./configure; makesans passer aucune option à configure, alors make installplacerez les morceaux de votre version désirée de GCC dans divers sous-répertoires de /usr/local.

L' /usr/localarborescence de répertoires est destinée aux logiciels installés par l'administrateur système en dehors du système de gestion des packages (c'est-à-dire exactement ce que vous faites). En tant que tel, les logiciels installés là-bas ne casseront pas les logiciels fournis sauf dans des circonstances extrêmement inhabituelles.

GCC en particulier est conçu autour de l'hypothèse que plusieurs versions seront installées. Cela nécessite à peu près des mesures actives de votre part pour casser quoi que ce soit (par exemple en mélangeant et en faisant correspondre des pièces pour essayer de créer une version hybride).

marque
la source
Vous ne devriez pas (et ne réussirez probablement pas) à construire GCC dans son arborescence source. Et vous voulez probablement des options supplémentaires à son configurescript (par exemple certaines, -program-suffix=etc.)
Basile Starynkevitch
0

J'ai finalement été frustré par cette approche et j'ai compilé GCC 6.3.0 à partir de l'archive tar source. La compilation a été réussie,

Tout d'abord, je recommanderais, si vous compilez GCC à partir de sa source, de choisir une version plus récente (par exemple GCC 7 fin 2017).

Ensuite, assurez-vous de construire GCC en dehors de son arborescence source et d'essayer d'abord son configurescript avec --helpet de passer plus d'options à sonconfigure . Lisez attentivement les instructions d' installation de GCC et comprenez le rôle de l' autoconf .

En pratique, je recommande

  • exécuter /usr/bin/gcc -vpour comprendre comment le GCC de votre système a été configuré

  • exécuter apt-get build-dep gcc-6(ou similaire) pour obtenir les dépendances GCC du système récent

  • créez un répertoire de construction en dehors de votre arborescence source GCC, et exécutez plus loin .../configure(remplacez ...par le chemin relatif approprié, par exemple ../gcc-7.2/) et makelà.

  • vous voudrez probablement passer au moins --program-suffix=-mineà cela configure(le -minepeut être remplacé par un autre suffixe) et vous pourriez même ajouter --prefix=$HOME/soft/si vous n'avez pas accès root. Vous aurez probablement besoin d' options supplémentaires à configureet vous devez choisir et leur donner soigneusement.

  • puis plus tard make install(vous pouvez même exécuter sans être root make install DESTDIR=/tmp/gccinst/et ensuite copier soigneusement et récursivement en tant que root qui /tmp/gccinst/....) installerait des choses dans /usr/local/bin/gcc-mineetc .... (ou $HOME/soft/bin/gcc-mine....) donc ne cassera aucun fichier installé par le système .

Notez que le FHS exige que le système de gestion des paquets laisse seul /usr/local/(ce qui est la valeur --prefixpar défaut pour GCC configure)

Basile Starynkevitch
la source
L'OP déjà a GCC 7, mais cherchait 6.3.0 suite à un commentaire reddit peu judicieux.
Stephen Kitt
0

Vous pouvez également utiliser une chaîne d'outils précompilée ou celle-ci pour votre architecture spécifique (x86_64, glibc, gcc 6.3).

Bien sûr, l'option suivante consiste à utiliser un soi-disant rootfs-builder comme buildroot ou yocto
pour générer une chaîne d'outils avec votre version spécifique de gcc.

Christian Stenzel
la source