Quando si costruisce un progetto mcu in bare metal basato su gcc, è necessario occuparsi dell'inizializzazione delle sezioni .data e .bss durante l'avvio.Come faccio a sapere da dove la sezione .data deve ottenere i dati di init? (gcc linker)
La sezione .bss è abbastanza semplice, visto che basta compilare l'intera sezione a 0. Ma variabili nella sezione .data ha bisogno di avere i loro dati di inizializzazione in rom/flash e copiati durante l'avvio.
Come sapere dove sono disponibili i dati con i valori di inizializzazione?
Facciamo un esempio.
Diciamo che creo due variabili globali in main.c
unsigned int my_global_variable_one = 1;
unsigned int my_global_variable_two = 2;
poi posso usare objdump sul file oggetto per vedere in quale sezione saranno in, ma non riesco a trovare nulla nell'objdump out put dove devono essere inseriti i dati di init.
$ arm-none-eabi-objdump --syms main.o | grep my_global_variable
00000000 g O .data 00000004 my_global_variable_one
00000004 g O .data 00000004 my_global_variable_two
Poi posso guardare l'elfo risultante per l'intero sistema, in questo caso main.elf.
$ arm-none-eabi-nm -n main.elf | grep my_global_variable
20000000 D my_global_variable_one
20000004 D my_global_variable_two
Dove posso trovare dove sono, quindi posso copiare i dati? Cosa devo inserire nel mio script linker?
Dovrebbe essere in qualcosa come .text o .rodata, ma come faccio a saperlo?
Come posso controllare dove sono i dati di init per my_global_variable_one?
Posso trovare dove sono questi dati con uno qualsiasi dei comandi binutils come readelf o objdump?
/Grazie
Questo è uno stm32 (Cortex M3) MCU, e la versione CodeBench di gcc viene utilizzato.
Beh ho notato che i dati viene aggiunto dopo la sezione .text, ma mi ha aiutato a ottenere abbastanza vicino :) – Johan