Obtenir des informations sur la section de mémoire

Quelqu’un peut-il m’expliquer comment le code suivant fonctionne?

# if defined(__ELF__) # define __SECTION_FLAGS ", \"aw\" , @progbits" /* writable flag needed for ld ".[cd]tors" sections bug workaround) */ # elif defined(__COFF__) # define __SECTION_FLAGS ", \"dr\"" /* untested, may be writable flag needed */ # endif asm ( ".section .ctors" __SECTION_FLAGS "\n" ".globl __ctors_begin__\n" "__ctors_begin__:\n" ".previous\n" ); asm /* ld ".[cd]tors" sections bug workaround */ ( ".section .ctors0" __SECTION_FLAGS "\n" ".globl __ctors0_begin__\n" "__ctors0_begin__:\n" ".previous\n" ); 

De même, nous obtenons __ctors_end__ , __ctors0_end__ et l’emplacement des destructeurs est également obtenu de cette façon. Après quelques solutions de contournement des bogues, toutes les fonctions pointées par les pointeurs de __ctors_begin__ à __ctors_end__ sont exécutées. Je ne sais pas assembleur et ce code est impossible à interpréter pour moi.

BTW: Je sais qu’invoquer des constructeurs / destructeurs C ++ à partir de C n’est pas une tâche qui doit être considérée comme sûre ou facile.

Ce n’est pas réellement un code exécuté par la CPU mais il est ajouté aux métadonnées des fichiers objects. Il indique à l’éditeur de liens de créer des variables globales ( __ctors_begin__ dans l’exemple ci-dessus) dans la même section (= partie) de l’exécutable final où les constructeurs sont stockés (cette section s’appelle .ctors ). Pour que cela fonctionne, vous devez simplement vous assurer que le fichier avec la variable “begin” est lié en premier et que le fichier avec la variable “end” est lié en dernier (mais vous pouvez peut-être également contrôler cela avec le __SECTION_FLAGS ). Cela vous donne la plage de mémoire que vous recherchez.

En ce qui concerne “safe”: Eh bien, le runtime C ++ n’est pas magique. D’une manière ou d’une autre, il doit savoir comment exécuter tous les constructeurs et les destructeurs au démarrage et cela ne change pas tout le temps. Donc, pour un numéro de version majeur de votre compilateur, cela devrait être assez sûr. De plus, vous saurez très bientôt quand il se cassera 🙂