Segmento Errore causato dall’utilizzo di nuovo o malloc sul dispositivo incorporato

Sto cercando di creare la mia applicazione con C++ anziché C per il mio MIPS based embedded device . Innanzitutto, ho avuto un problema di collegamento che puoi vedere qui . Questo problema è stato risolto e potrei creare la mia applicazione con successo. Nel mio codice, utilizzo la funzione malloc per l’allocazione di memoria, ma quando chiamo questa funzione, ricevo il messaggio "Segment Fault" . Ho sostituito malloc con un new operatore, ma il risultato è stato lo stesso. Per ulteriori informazioni, vedere il codice qui sotto:

  int main(int argc, char** argv) { char* str = (char*)malloc(10 * sizeof(char)); //or char* str = new char[10]; strcpy(str, "Hello"); return 0; } 

Quando viene eseguita la riga 3 e viene chiamata la funzione malloc , sullo schermo viene visualizzato il messaggio "Segment Fault" . Se uso mipsel-elf-gcc invece di mipsel-elf-g++ , non ho questo problema.

Cosa c’è di sbagliato qui?

Scrivi che la tua piattaforma di destinazione è un processore ARMv7, ma il tuo cross-compilatore è un compilatore mipsel. Dovresti scaricare una toolchain per ARM. I toolchain di Sourcery Lite di Mentor Graphics sono piuttosto buoni.

Ad esempio, puoi provare a compilare il tuo programma con arm-2011.03-41 .

Il codice della libreria per malloc () è probabile che sia maturo e corretto. Le librerie della catena di strumenti GNU richiedono uno specifico livello di porting per incollare la libreria all’hardware e / o al sistema operativo di destinazione. Nel caso di malloc (), e in C ++ new , e le loro varianti il ​​codice di sistema rilevante è in sbrk() (o sbrk_r() per re-entrancy, sebbene di solito sia esso stesso un wrapper aropund sbrk() ).

L’implementazione di sbrk() del fornitore della catena di strumenti è probabilmente una stub generica e non adattata al tuo target specifico. Dovrai averlo implementato per il tuo ambiente di runtime.