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
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!
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.
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.
Hilft ldd in diesem Fall?
- 1. Kompilieren/Kompilieren eines ActiveX für mobile Geräte
- 2. Architektur eines Plattformautorisierungsberechtigungsmodells
- 3. Erkennung der CPU-Architektur eines bestimmten Prozesses in C#
- 4. Bietet das Kompilieren mit einer bestimmten .NET-Version irgendwelche Vorteile?
- 5. Xcode iOS6 kompilieren Fehler: Keine Architektur
- 6. Kompilieren von Multi-Architektur-Code mit Agners Vector Class Library
- 7. Kompilieren eines Syntaxbaums mit Roslyn
- 8. Kreuz kompilieren eines Kernel-Moduls
- 9. Kompilieren eines Objective-C-Programms
- 10. Kompilieren eines C-Programms meine Verknüpfung mit einer externen Bibliothek
- 11. Ermitteln der Architektur eines Prozesses
- 12. Kompilieren eines Projekts mit unterschiedlicher Java-Quellkompatibilität
- 13. Löschen eines Div mit einer bestimmten Klasse mit BeautifulSoup
- 14. Alle Commits eines bestimmten Autors seit einer bestimmten Zeit zurücksetzen
- 15. mit Autofac in einer mehrschichtigen Architektur
- 16. Was ist der Zweck eines BPM in einer reinsten Architektur?
- 17. Kompilieren einer bestimmten Version von DotNetOpenAuth mit einer kleinen Änderung, signieren Probleme
- 18. Erstellen eines Plotfensters einer bestimmten Größe
- 19. Löschen eines bestimmten Kontextes einer Leinwand
- 20. Ändern eines bestimmten Bytes in einer Datei
- 21. Entwicklung eines Betriebssystems für die x86-Architektur
- 22. ./configure mit einer bestimmten Version von g ++
- 23. Kompilieren einer .C-Datei: Nicht definierte Symbole für die Architektur x86_64
- 24. Jedes Pixel eines Bildes mit einer bestimmten Farbe transparent machen
- 25. Wie Kommentar Code mit einer generischen Klasse eines bestimmten Typs
- 26. Tensorflow: Ausführen eines Ops mit einem bestimmten Kern einer CPU
- 27. jQuery - erhält den Index eines Elements mit einer bestimmten Klasse
- 28. Auswahl eines bestimmten div von einer externen Webseite mit CURL
- 29. Boolesche Eigenschaften eines Sets einer bestimmten Klasse mit Checkboxen verknüpfen
- 30. Verknüpfen eines Arrays von Arbeitsblättern mit einer bestimmten Arbeitsmappe