2016-08-08 47 views
0

meine Frage könnte etwas dumm sein, aber ich hatte immer diese Frage in meinem Kopf.Wie produziert GCC-Compiler Maschine/Prozessor unabhängige Binärdatei?

Wie bestimmt der gcc zur Kompilierzeit, für welche Zielmaschine/Prozessor er gebaut wird?

Sind die von gcc/g ++ generierten Anweisungen zielsystemunabhängig?

Zum Beispiel habe ich eine x86_64 Maschine mit Intel-basierten AMD basierte, Motorola basierten System etc ...

Hat alle Prozessoren den gleichen Befehlssatz und Opcode damit verbunden?

Wenn nicht der von gcc generierte Maschinencode/Binärcode irgendeine Art von Laufzeitprüfung hat?

Vielen Dank im Voraus für die Antwort.

Antwort

0

Dies ist ein bisschen kompliziert. Es hängt davon ab, wie GCC während der Installation konfiguriert und kompiliert wurde. Auf meinem Ubuntu 16.04 x64 System gibt es eine GCC Installation.

Wenn in Terminal I gcc -v geben, ich --target=x86_64-linux-gnu bekommen, was bedeutet, GCC Code für x64 Linux produzieren wird. --host=x86_64-linux-gnu bedeutet GCC selbst ist x64-Linux-Anwendung. Mehr davon bei der link.

Eine andere nützliche Ausgabe zu betrachten ist --with-multilib-list=m32,m64,mx32 - es bedeutet, dass ich für die Standard-64-Bit-Anwendung zusammen mit zwei Arten von 32-Bit-Anwendungen (-m32 und -mx32) kompilieren konnte.

Last but not least ist --with-tune=generic, was bedeutet, dass Anwendungen für einige generic x64-Plattform und Benutzer erstellt werden sollte fähig sein, sie überall auf x64-Linux-Box zu laufen.

Es gibt zwei Optionen zu überschreiben - -march und -mtune. Die Arch-Option teilt dem Compiler mit, dass er die für eine bestimmte CPU spezifische Instruktion verwenden soll. Tune passt die Code-Generierung an die bestmögliche CPU an. Die CPU ist entweder eine bestimmte Plattform (wie etwa sandybridge), eine generische Plattform (normalerweise ein Standard) oder native, wobei GCC während der Kompilierung die Host-CPU prüft und Code-Generierung/Tuning dafür durchführt.

Der letzte Optionssatz umfasst die Einstellung für FPU - Sie können auswählen, welches Gerät (x87 oder SSE2 +), Befehlssatz (SSE2, 3, 4, AVX) usw. verwendet werden soll. Gehen Sie dazu in dieses link.

+0

Danke für die Antwort, aber wenn Sie angeben --target = x86_64-linux-gnu als GCC-Option ist es ein generisches x86_64 Arch System richtig? Bedeutet das, dass alle Prozessoren demselben Befehlssatz folgen? –

+0

@Ranjith Ja, mit generischen Arch wäre es generische x86_64 wie von AMD vor mehr als 10 Jahren definiert - 16 Ganzzahlregister, 16 SSE2, 64bit ISA, flacher Adressraum. 'Also bedeutet das, dass alle Prozessoren demselben Befehlssatz folgen?' Nun, es ist eine minimale Teilmenge, die von allen kompatiblen x64-CPUs (von AMD, Intel, VIA) geteilt wird, so dass Programme mit generischem x86_64 auf jeder dieser CPUs funktionieren sollen. –