2014-04-11 10 views
6

Angenommen, Sie haben eine Cross-Compilierungs-Werkzeugkette, die Binärdateien für die ARM-Architektur erzeugt.Was sind die Unterschiede zwischen der C/C++ - Bare-Metal-Kompilierung und der Kompilierung für ein bestimmtes Betriebssystem (Linux)?

Ihre Werkzeug-Kette ist das wie (läuft auf einer X86_64 Maschine mit Linux):

  • Arm-linux-gnueabi-gcc.exe: für Cross-Kompilierung für Linux auf ARM laufen.
  • arm-gcc.exe: für Bare-Metal Cross-Compilation-Targeting auf ARM.

... und die Fülle anderer Tools für Cross-Compilierung auf ARM.

Punkte, die mich interessiert sind:

  • (E) ABI Unterschiede zwischen Binärdateien (falls vorhanden)
  • Einschränkungen bei Bare-Metal (wie dynamische Speicherzuordnungen, Verwendung von statischen Konstruktoren im Falle von C++, Threading-Modellen, etc.)
  • binäre Unterschiede zwischen den beiden Fällen in Bezug auf Informationen zu jedem von ihnen (wie Debug-Info-Unterstützung, etc.);
+0

Das klingt wie "Unterschied zwischen meinem kleinen Programm und meinem Betriebssystem" ... – deviantfan

+0

@deviantfan: Sound eher wie "Kann ich alle" normalen "Funktionen von C/C++ verwenden, die ich für Firmware (Bare-Metal) Entwicklung? " Nach dem Lesen dieses Artikels hier: http://www.state-machine.com/arm/Building_bare-metal_ARM_with_GNU.pdf Ich bemerkte einige Einschränkungen von Bare-Metal C/C++. Gibt es noch mehr (und auch Unterschiede)? :) – Liviu

+1

Für * echtes Bare Metal * müssen Sie eine Portabilitätsschicht für * newlib * schreiben. Auf Gnu Linux, entweder * eglibc * oder [* glibc *] (http: //en.wikipedia.org/wiki/GNU_C_Library) wird verwendet. Grundsätzlich ist Ihre Frage, was ist der Unterschied. Es gibt 1000s. Möchten Sie 'mmap()' verwenden? Usw. Die binären/Compiler-Unterschiede spielen keine Rolle (meistens). Es sind die C-Bibliotheken, die völlig verschieden sind. Datei-E/A? –

Antwort

3
  • ABI Unterschiede bis zu, wie Sie den Compiler aufrufen, zum Beispiel GCC hat -mabi und das kann man von 'APCs-Gnu', 'atpcs', 'aapcs', 'aapcs-linux' und "iwmmxt".
  • Auf Bare-Metal-Beschränkungen für verschiedene Laufzeitfunktionen existiert, weil jemand sie nicht zur Verfügung gestellt hat. Sei es das Initialisieren von null zugewiesenen Bereichen oder das Bereitstellen von C++ - Funktionen. Wenn Sie sie liefern können, werden sie funktionieren.
  • Binäre Pegelunterschiede hängen auch davon ab, wie Sie den Compiler aufrufen.

Sie können GCC ARM options online überprüfen.

1

Ich habe vor kurzem ein kleines Projekt gestartet, um eine Linux-Standard-C-Bibliothek in einer Bare-Metal-Umgebung zu verwenden. Ich habe es in meinem Blog beschrieben: http://ellcc.org/blog/?page_id=289 Im Grunde habe ich eine Möglichkeit eingerichtet, Linux-Systemaufrufe zu behandeln, so dass durch die Implementierung vereinfachter Versionen bestimmter Systemaufrufe Funktionen aus der Standardbibliothek verwendet werden können. Der aktuelle Status für den ARM implementiert beispielsweise vereinfachte Versionen von read(), readv(), write(), writev() und brk(). Dies erlaubt mir, printf(), fgets() und malloc() unverändert zu verwenden.

Ich bin mein Fall, ich verwende den gleichen Compiler für das Targeting von Linux und Bare-Metal. Da es clang/LLVM ist, kann ich denselben Compiler auch für andere Prozessoren verwenden. Ich arbeite gerade an einem Bare-Metal-Beispiel für die Mips.

Also ich denke die Antwort ist, dass es keinen Unterschied geben muss.