Rassemblez des variables de plusieurs fichiers dans un seul bloc de mémoire contigu au moment de la compilation

J’aimerais définir (et initialiser) un certain nombre d’instances d’une structure dans un certain nombre de fichiers * .c, mais je souhaite qu’elles se rassemblent au moment de la compilation dans un seul tableau contigu. J’ai étudié la possibilité d’utiliser une section personnalisée et d’utiliser l’adresse de début et de fin de la section comme début et fin du tableau de structures, mais je n’ai pas encore tout compris, et je préférerais ne pas écrire de personnalisation. linker script si je peux m’en sortir. Voici un résumé de mon premier piratage qui n’a pas tout à fait fonctionné:

// mystruct.h: typedef struct { int a; int b; } mystruct; // mycode1.c: #include "mystruct.h" mystruct instance1 = { 1, 2 } __atsortingbute__((section(".mysection"))); // mycode2.c: #include "mystruct.h" mystruct instance2 = { 3, 4 } __atsortingbute__((section(".mysection"))); // mystruct.c: extern char __mysection_start; extern char __mysection_end; void myfunc(void) { mystruct * p = &__mysection_start; for ( ; p a and p->b } } 

Pour utiliser une section personnalisée, vous devez définir son adresse de départ dans un script de l’éditeur de liens personnalisé. Copiez le script de l’éditeur de liens de votre appareil et ajoutez la nouvelle section à son bloc SECTIONS :

 /* in custom.gld */ mysection 0x2000 : { *(mysection); } >data 

Pour que vos objects entrent dans cette section, utilisez l’atsortingbut section:

 /* mycode1.c: */ #include "mystruct.h" mystruct __atsortingbute__((section("mysection"))) instance1 = { 1, 2 }; /* mycode2.c: */ #include "mystruct.h" mystruct __atsortingbute__((section("mysection"))) instance2 = { 3, 4 }; 

Maintenant, pour obtenir les limites de votre section personnalisée, vous pouvez utiliser les .startof.(section_name) et .sizeof.(section_name) :

 #include "mystruct.h" char *mysection_start; char *mysection_end; size_t mysection_size; int main(void) { asm("mov #.startof.(mysection), W12"); asm("mov #.sizeof.(mysection), W13"); asm("mov W12, _mysection_start"); asm("mov W13, _mysection_size"); mysection_end = mysection_start + mysection_size; mystruct *p = (mystruct *)mysection_start; for ( ; (char *)p < mysection_end ; p++) { // do stuff using p->a and p->b } }