2014-04-11 21 views
6

Supponiamo di avere una catena di strumenti cross-compilation che produce file binari per l'architettura ARM.Quali sono le differenze tra compilazione e compilazione bare-metal C/C++ per un sistema operativo specifico (Linux)?

tuo tool-chain è come questo (in esecuzione su una macchina X86_64 con Linux):

  • braccio-linux-gnueabi-gcc.exe: per il cross-compilazione per Linux, in esecuzione su ARM.
  • arm-gcc.exe: per il targeting cross-compilation bare-metal ARM.

... e la pletora di altri strumenti per cross-compilation su ARM.

I punti che mi interessano sono:

  • differenze (E) ABI tra i binari (se presente)
  • limitazioni in caso di bare-metal (come le allocazioni di memoria dinamica, utilizzo di costruttori statici in caso di C++, modelli di threading, ecc.)
  • differenze a livello binario tra i 2 casi in termini di informazioni specifiche per ciascuno di essi (come il supporto di informazioni di debug, ecc.);
+0

Che suona come "differenza tra il mio piccolo programma e il mio sistema operativo" ... – deviantfan

+0

@deviantfan: suonare più come "Posso usare tutte le 'caratteristiche normali' di C/C++ che io sono abituato a per il firmware (sviluppo di metallo nudo? " Dopo aver letto questo articolo qui: http://www.state-machine.com/arm/Building_bare-metal_ARM_with_GNU.pdf Ho notato alcune limitazioni del bare-metal C/C++. Ce ne sono altri (e anche le differenze)? :) – Liviu

+1

Per * real bare metal *, è necessario scrivere un layer di portabilità per * newlib *. Su Gnu Linux, * eglibc * o [* glibc *] (http: //en.wikipedia.org/wiki/GNU_C_Library) è usato. Fondamentalmente, la tua domanda è qual è la differenza. Ce ne sono 1000 Vuoi usare 'mmap()'? Ecc. Le differenze binarie/compilatore non contano (soprattutto). Sono le librerie "C" completamente diverse. File I/O? –

risposta

3
  • differenze ABI è fino al modo in cui si richiama il compilatore, ad esempio GCC ha -mabi e che può essere uno dei 'APC-gnu', 'atpcs', 'aapcs', 'aapcs-linux' e 'iwmmxt'.
  • Sulle limitazioni bare metal per varie funzionalità di runtime esiste perché qualcuno non le ha fornite. Sii loro inizializzando zero aree allocate o fornendo funzionalità C++. Se puoi fornirli, funzioneranno.
  • Le differenze di livello binario dipendono anche da come viene richiamato il compilatore.

È possibile verificare GCC ARM options online.

1

Recentemente ho avviato un piccolo progetto per utilizzare una libreria C standard di Linux in un ambiente bare metal. L'ho descritto sul mio blog: http://ellcc.org/blog/?page_id=289 Fondamentalmente quello che ho fatto è impostare un modo per gestire le chiamate di sistema Linux in modo che, implementando versioni semplificate di determinate chiamate di sistema, possa utilizzare le funzioni della libreria standard. Ad esempio, lo stato corrente per ARM implementa versioni semplificate di read(), readv(), write(), writev() e brk(). Questo mi permette di usare printf(), fgets() e malloc() invariati.

Sono il mio caso, io uso lo stesso compilatore per il targeting di Linux e bare-metal. Essendo basato su clang/LLVM, posso anche usare lo stesso compilatore per indirizzare altri processori. In questo momento sto lavorando ad un esempio di bare metal per i Mips.

Quindi credo che la risposta sia che non ci deve essere alcuna differenza.