mi sono imbattuto in questo problema. Qui ci sono le condizioni che sembrano generare in modo affidabile il problema:
- g ++ collega senza l'/ C++ libreria standard C:
-nostdlib
(scenario tipico piccolo incorporato).
- Definizione di un oggetto libreria standard allocato staticamente; specifico per il mio caso è
std::vector
. Precedentemente questo era std::array
assegnato staticamente senza alcun problema. Apparentemente non tutti gli oggetti allocati staticamente a std::
causeranno il problema.
- Nota che non sto utilizzando una libreria condivisa di alcun tipo.
- GCC/ARM cross compiler è in uso.
Se questo è il vostro caso d'uso allora semplicemente aggiungere l'opzione riga di comando per la riga di comando/link di compilazione: -fno-use-cxa-atexit
Ecco un ottimo collegamento al __dso_handle usage as 'handle to dynamic shared object'.
Sembra che ci sia un errore di battitura nella pagina, ma non ho idea di chi contattare per confermare:
Dopo aver chiamato i distruttori del costruttore degli oggetti GCC chiama automaticamente la funzione di ...
Penso che questo dovrebbe leggere "una volta che tutti i distruttori sono stati chiamati GCC chiama la funzione" ...
Un modo per confermare questo sarebbe per implementare la funzione __cxa_atexit
come detto e poi solo passo il programma e vedere dove viene chiamato Ci proverò uno di questi giorni, ma non adesso.