2010-03-13 8 views
11

Ich habe kürzlich einige Probleme bekämpft, die beim Versuch, eine Open Source-Bibliothek auf meinem Mac zu kompilieren, die von einer anderen Bibliothek abhing und einige Fehler inkompatible Bibliotheksarchitekturen verursachte. Kann jemand das Konzept hinter der Erstellung eines C-Programms für eine bestimmte Architektur erklären? Ich habe das -arch Compiler-Flag vorher gesehen und gesehen Werte wie ppc, i386 und x86_64 übergeben, die ich Karten auf die CPU "Sprache" nehme, aber mein Verständnis hört dort auf. Wenn ein Programm eine bestimmte Architektur verwendet, müssen alle Bibliotheken, die es lädt, auch auf derselben Architektur sein? Wie kann ich feststellen, unter welcher Architektur ein bestimmtes Programm/Prozess läuft?Kompilieren eines C-Programms mit einer bestimmten Architektur

Antwort

13

Kann jemand das Konzept hinter der Kompilierung eines C-Programms für eine bestimmte Architektur erklären?

Ja. Die Idee ist, C in eine Sequenz nativer Maschinenanweisungen zu übersetzen, die das Programm in Binärform codieren. Die Bedeutung von "Architektur" ist hier die "Instruction Set Architektur", in der die Anweisungen binär codiert sind. Zum Beispiel hat jede Architektur ihre eigene Art, einen Befehl zu codieren, der zwei Ganzzahlen hinzufügt.

Der Grund für das Kompilieren von Anweisungen besteht darin, dass sie sehr, sehr schnell ausgeführt werden.

Wenn ein Programm eine bestimmte Architektur verwendet, müssen alle Bibliotheken, die es lädt, auch auf derselben Architektur sein?

Ja. (Ausnahmen bestehen aber sie sind selten.)

Wie kann ich feststellen, welche Architektur ein gegebenes Programm/Prozess unter ausgeführt wird?

Wenn ein Prozess auf Ihrer Hardware ausgeführt wird, ist es auf der nativen Architektur ausgeführt wird, die auf Unix Sie, indem Sie den Befehl uname -m, obwohl für den menschlichen Leser die Ausgabe von uname -a sein kann informativer entdecken.

Wenn Sie eine ausführbare Binärdatei oder eine gemeinsam genutzte Bibliothek (.so-Datei) haben, können Sie die Architektur mit dem file Befehl entdecken:

% file /lib/libm-2.10.2.so 
/lib/libm-2.10.2.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped 
% file /bin/ls 
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped 

Sie können sehen, dass diese Binärdateien für die sehr alte kompiliert wurden 80386 Architektur, obwohl meine Hardware ein moderner i686 ist. Der i686 (Pentium Pro) ist abwärtskompatibel zu 80386 und führt 80386-Binärdateien sowie native Binärdateien aus. Um diese Rückwärtskompatibilität möglich zu machen, hat Intel eine Menge Probleme und Kosten gemacht, aber sie haben den Markt auf Desktop-CPUs praktisch in die Enge getrieben, also hat es sich gelohnt!

1

Um für eine andere Architektur als die native Ihrer CPU zu bauen, benötigen Sie einen Cross-Compiler, was bedeutet, dass der generierte Code nicht nativ auf der Maschine laufen kann, auf der Sie sitzen. GCC kann das gut machen. Um herauszufinden, für welche Architektur ein Programm erstellt wurde, checken Sie den Dateibefehl aus. Zumindest in Linux-basierten Systemen benötigt ein 32-Bit-x86-Programm 32-Bit-x86-Bibliotheken, um damit zu arbeiten. Ich denke, für die meisten Betriebssysteme ist es dasselbe.

3

Eine Sache, die hier möglicherweise verwirrend ist, ist, dass die Mac-Plattform hat, was sie eine universal binary nennen, die wirklich zwei Binaries in einem Archiv ist, eins für Intel und das andere für ppc Architektur. Ihr Computer wird automatisch entscheiden, welche ausgeführt werden soll. Sie können (manchmal) eine Binärdatei für eine andere Architektur in einem Emulationsmodus ausführen, und einige Architekturen sind Obermengen anderer (dh i386-Code wird normalerweise auf einem i486, i586, i686 usw. ausgeführt), aber größtenteils der einzige Code Sie können Code für die Architektur Ihres Prozessors ausführen.

Für das Cross-Compiling müssen nicht nur das Programm, sondern alle verwendeten Bibliotheken mit dem Zielprozessor kompatibel sein. Manchmal bedeutet dies, dass ein zweiter Compiler installiert ist, manchmal ist es nur eine Frage, ob das richtige zusätzliche Modul für den Compiler verfügbar ist. Der Cross-Compiler für gcc is actually a seperate executable, though it can sometimes be accessed via a command line switch. Die gcc-Kreuzcompiler für verschiedene Architekturen sind höchstwahrscheinlich separate Installationen.

Verwandte Themen