Wie installiere ich eine bestimmte Version von GCC unter Kali Linux?

8

Diese Frage scheint an mehreren Fragen und an anderen Stellen, die mit Google leicht zu finden sind, richtig beantwortet zu werden, aber ich finde die Lösung aus den unten erläuterten Gründen nicht zufriedenstellend. Aber nur zur Vervollständigung habe ich einige relevante Links eingefügt:

/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 ...

Und andere.

Diese Frage bezieht sich jedoch auf die Installation einer sehr spezifischen Version von GCC unter Kali Linux, die als spezifisches Paket nicht ohne weiteres verfügbar zu sein scheint. Die Frage betrifft insbesondere die Installation von Version 6.3.0, da ich diese Version zum Kompilieren eines bestimmten Programms benötige: https://www.reddit.com/r/Monero/comments/6d0ah8/xmrig_miner_new_release/

(Als Bonusfrage können Sie diese Frage gerne beantworten, wenn es einen vernünftigeren Weg gibt, dieses spezielle Problem zu beheben, ohne eine andere Version von GCC zu verwenden. Ich glaube jedoch, dass diese Frage allgemein ist und ich möchte wissen, wie sie unabhängig davon zu tun ist wie man den oben genannten Programmlink richtig macht)

Die Versionen, die für die Installation eines Pakets verfügbar sind, z. B. gcc, können wie folgt ermittelt werden:

apt-cache showpkg gcc

Welches listet die verfügbaren Versionen unter "Versionen:" auf, z

4:7.2.0-1d1
4:4.9.2-2

Die Installation ist dann so einfach wie das Ausstellen

apt-get install gcc:4:4.9.2-2

Dadurch wird die ältere Version 4: 4.9.2-2 installiert, indem einfach (glaube ich) die Installation von 7.2.0-1d1 überschrieben wird, falls vorhanden.

Um Version 4: 4.9.2-2 überhaupt verfügbar zu machen, musste ich deb http://old.kali.org/kali sana main non-free contribmeine /etc/apt/sources.listDatei hinzufügen und dann ausführen apt-get update.

Was ist jedoch, wenn die von mir benötigte Version nicht aufgeführt ist?

Ich habe mit verschiedenen Quellen experimentiert, z. B. den hier gefundenen: http://snapshot.debian.org/ und bei verschiedenen anderen Fragen und Websites aus Google-Suchanfragen.

Die meisten von ihnen geben mir Ignorieren oder Fehler, zB wie folgt

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

Selbst wenn dies funktionieren würde, scheint es ein sehr schlechter Ansatz zu sein, eine bestimmte Version zu installieren, da das Hinzufügen einer beliebigen Quelle möglicherweise nicht die gewünschte Version hat.

Wenn ich auf snapshot.debian.org nach gcc suche, erhalte ich nur sehr alte Versionen: http://snapshot.debian.org/package/gcc/

Ich wurde schließlich mit diesem Ansatz frustriert und kompilierte GCC 6.3.0 aus dem Quell-Tarball. Die Kompilierung war erfolgreich, aber dann muss ich sie installieren. Ich bin vorsichtig laufen , make installwie ich es fürchten manipulieren aptund dpkgmöglicherweise das System zu brechen.

Stattdessen habe ich versucht, es direkt aus dem Build-Verzeichnis auszuführen. Ich habe versucht, einfach das Build-Verzeichnis als ersten Eintrag in meinem PATH hinzuzufügen, was nicht funktioniert hat. Dann habe ich versucht, umzubenennen /usr/bin/gccund einen Symlink von dort /usr/bin/gcczu erstellen , wo sich meine ausführbare Datei gcc-6.3.0 befindet. Dies stellt das folgende Problem dar:

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

Dies wurde mit einem anderen Eintrag in meinem Pfad behoben.

Dann bekomme ich diesen Fehler:

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

Was ich vermute, liegt an einem fehlenden Eintrag in /usr/lib/gcc/x86_64-linux-gnu. Ich habe versucht, einen Symlink von 6 auf 6.3.0 zu erstellen, aber das war nicht ausreichend. Ich habe auch versucht, alles mit dem cp -Rgleichen Ergebnis zu kopieren .

Dies sollte ein 64-Bit-Programm sein, aber ich habe das auch für in Betracht gezogen /usr/lib/gcc/i686-linux-gnu.

Ich bin sicher, ich könnte anfangen stracezu sehen, wo es versucht, die Dateien zu öffnen, Protokolldateien zu lesen, die Quelle zu lesen, und schließlich kann ich mir vorstellen, wie ich eine schlecht konzipierte Lösung zusammenhacken kann. Aber es wäre schön, wenn mir jemand sagen könnte, wie man das auf vernünftige Weise macht.

Alpha Centauri
quelle
Dies beeinträchtigt nicht die allgemeinen Vorzüge Ihrer Frage. Aktuelle Versionen von XMRig sollten jedoch gut mit GCC 7 funktionieren , sodass Sie es nur erstellen können sollten, ohne mit GCC 6.3 herumzuspielen.
Stephen Kitt
Sie können GCC (jede nicht zu alte Version) jederzeit aus dem Quellcode kompilieren , da es sich um freie Software handelt. Seien Sie vorsichtig bei der Konfiguration und erstellen Sie es außerhalb des Quellbaums.
Basile Starynkevitch

Antworten:

10

Wie installiere ich eine bestimmte Version von GCC unter Kali Linux?

GCC 6 ist unter Kali Linux verfügbar und kann wie folgt installiert werden:

apt install g++-6 gcc-6

Umschalten zwischen gcc6 und 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

Beispielausgabe:

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:

Wählen Sie Ihre Standardversion gcc.

am 2017-08-05 wird die gcc-6 version von 6.3.0auf aktualisiert 6.4.0.

Installation gemäß xmrigden Anweisungen des Builds.

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

Erstellen einer bestimmten gcc-Version 6.3.0

Laden Sie den Tarball vom nächsten Spiegel herunter : 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

Hinzufügen gcc-6.3zuupdate-alternatives

Wichtig : Die --disable-multilibOption ist erforderlich, um gccdie aktuelle Architektur zu konfigurieren und zu erstellen .

GCC WIKI: GCC installieren

GAD3R
quelle
1
Verzeihen Sie mir, aber installiert dies nicht die Version von GCC, die "gcc-6" bietet? Was ist, wenn ich speziell 6.3.0 installieren möchte?
AlphaCentauri
@AlphaCentauri vor 6 Monaten ist die verfügbare gcc6-Version 6.3.0, jetzt wird die gcc6-Version auf aktualisiert 6.4.0.
GAD3R
1
@AlphaCentauri Antwort aktualisiert einschließlich der Bauschritte.
GAD3R
1
  1. Zuerst müssen Sie auf diese Website gehen: http://gcc.gnu.org/mirrors.html
  2. Wählen Sie dann alte Versionen aus und Sie werden verschiedene Versionen sehen.
  3. Jetzt sollten Sie auf die gewünschte klicken, und der Download wird gestartet.

  4. Schließlich müssen Sie aus der Quelle kompilieren und installieren: /ubuntu/25961/how-do-i-install-a-tar-gz-or-tar-bz2-file

Prashant Luhar
quelle
1
Danke, aber ich glaube nicht, dass Sie meine ganze Frage gelesen haben. Ich habe darauf hingewiesen, wie ich versucht habe, aus dem Quellcode zu kompilieren. Das Problem dabei (wie in meiner Frage ausgeführt) ist, dass "make install" auf GCC möglicherweise keine gute Idee ist, da dies möglicherweise das System beschädigen könnte. Darüber hinaus bringt das einfache Ausführen von GCC ohne make install seine eigenen Herausforderungen mit sich, die ich auch in meiner ursprünglichen Frage skizziert habe.
AlphaCentauri
Sie haben in Ihrer Frage angegeben, dass make installmöglicherweise manipuliert werden dpkgoder apt... können Sie näher darauf eingehen ! @AlphaCentauri
Prashant Luhar
0

Wenn Sie einen Standard erstellt haben, ./configure; makeohne Optionen zu übergeben configure, make installwerden die Teile Ihrer gewünschten Version von GCC in verschiedenen Unterverzeichnissen von abgelegt /usr/local.

Der /usr/localVerzeichnisbaum ist für Software vorgesehen, die vom Systemadministrator außerhalb des Paketverwaltungssystems installiert wird (dh genau das, was Sie tun). Daher wird die dort installierte Software die verpackte Software nur unter äußerst ungewöhnlichen Umständen beschädigen.

Insbesondere GCC basiert auf der Annahme, dass mehrere Versionen installiert sind. Es erfordert so ziemlich aktive Maßnahmen von Ihrer Seite, um etwas zu zerbrechen (z. B. durch Mischen und Anpassen von Teilen, um zu versuchen, eine Hybridversion zu erstellen).

Kennzeichen
quelle
Sie sollten GCC nicht in seinem Quellbaum erstellen (und werden es wahrscheinlich auch nicht schaffen). Und Sie möchten wahrscheinlich zusätzliche Optionen zu seinem configureSkript (z. B. einige -program-suffix=usw.)
Basile Starynkevitch
0

Ich wurde schließlich mit diesem Ansatz frustriert und kompilierte GCC 6.3.0 aus dem Quell-Tarball. Die Zusammenstellung war erfolgreich,

Zunächst würde ich empfehlen, wenn Sie GCC aus seiner Quelle kompilieren, eine neuere Version zu wählen (z. B. GCC 7 Ende 2017).

Stellen Sie dann sicher, dass Sie GCC außerhalb des Quellbaums erstellen und zunächst das configureSkript mit versuchen --helpund weitere Optionen an dasconfigure GCC übergeben . Lesen Sie die GCC-Installationsanweisungen sorgfältig durch und verstehen Sie die Rolle von Autoconf .

In der Praxis empfehle ich

  • Führen Sie /usr/bin/gcc -vdiese Option aus, um zu verstehen, wie der GCC Ihres Systems konfiguriert wurde

  • Führen Sie apt-get build-dep gcc-6(oder ähnliches) aus, um die GCC-Abhängigkeiten des aktuellen Systems abzurufen

  • Erstellen Sie ein Build-Verzeichnis außerhalb Ihres GCC-Quellbaums und führen Sie es weiter aus .../configure( ...z . B. durch einen entsprechenden relativen Pfad ersetzen ../gcc-7.2/) make.

  • Sie möchten wahrscheinlich zumindest --program-suffix=-minedas übergeben configure(das -minekann durch ein anderes Suffix ersetzt werden) und Sie können es sogar hinzufügen, --prefix=$HOME/soft/wenn Sie keinen Root-Zugriff haben. Sie werden wahrscheinlich wollen weitere Optionen zu configureund Sie müssen sie sorgfältig wählen und geben.

  • dann würde ein späterer make install(Sie könnten sogar ohne root ausgeführt werden make install DESTDIR=/tmp/gccinst/und später sorgfältig und rekursiv als root kopieren, der /tmp/gccinst/....) Dinge in /usr/local/bin/gcc-mineetc .... (oder $HOME/soft/bin/gcc-mine....) installieren, so dass keine vom System installierten Dateien beschädigt werden .

Beachten Sie, dass das Paketverwaltungssystem laut FHS in Ruhe gelassen werden muss /usr/local/(dies ist die Standardeinstellung --prefixfür GCCs configure).

Basile Starynkevitch
quelle
Die OP bereits haben GCC 7, sondern suchten 6.3.0 nach einem fehlgeleiteten reddit Kommentar.
Stephen Kitt
0

Sie können auch eine vorkompilierte Toolchain oder diese für Ihre spezifische Architektur verwenden (x86_64, glibc, gcc 6.3).

Die nächste Option ist natürlich die Verwendung eines sogenannten rootfs-Builders wie buildroot oder yocto
, um eine Toolchain mit Ihrer spezifischen gcc-Version zu generieren.

Christian Stenzel
quelle