OVH Cloud OVH Cloud

[VC++] Création de sections

2 réponses
Avatar
Manhattan
J'essaie de créer une section avec VC++. La section doit servir à contenir
des structures les unes à la suite des autres.
J'aurais besoin de récupérer l'adresse de début et de fin de la section sans
appeler de fonctions Windows. J'ai lu que le linker concaténait les sections
de même nom, en utilisant la chaîne après le '$' pour ordonner les sous
sections. J'utilise donc le code suivant :

#pragma section("Section$a")
#pragma section("Section$b")
#pragma section("Section$z")

__declspec(allocate("Section$a")) MYSTRUCT SectionStart;
__declspec(allocate("Section$b")) MYSTRUCT InSection;
__declspec(allocate("Section$z")) MYSTRUCT SectionEnd;

Le problème c'est que les sections n'ont pas la bonne taille et ne sont pas
contigues.

0006:00000000 00000109H Section$a DATA
0006:0000010c 00000126H Section$b DATA
0006:00000234 00000109H Section$z DATA

Y'a t'il une autre méthode ?

2 réponses

Avatar
AMcD®
T'essayes de faire quoi excatement ?

--
AMcD®

http://arnold.mcdonald.free.fr/
Avatar
Manhattan
"AMcD®" wrote in message
news:411111b0$0$15278$
T'essayes de faire quoi excatement ?

--
AMcD®

http://arnold.mcdonald.free.fr/




C'est dans le but de compter le nombre d'appels à des fonctions pour faire
du profiling basique. Mon idée était de déclarer une structure du type

struct PROFILE
{
char* function_name;
int num_calls;
}

Ensuite à l'entrée de chaque fonction j'aurais mis :

void function1()
{
PROFILE_IN(function1)
/* ... */
}

void function2()
{
PROFILE_IN(function2)
/* ... */
}

etc

PROFILE_IN serait une macro du genre :

#define PROFILE_IN(f)
__declspec(allocate("ProfileSection")) static PROFILE prof;
prof.function_name = #f;
prof.num_calls++;

De cette facon, toutes les structures seraient allouées dans une seule
section. Ce qui est pratique c'est que la macro peut être utilisée dans
plusieurs fichiers. Pour afficher les stats, il suffirait de parcourir la
section comme si c'était un tableau de structures :

PROFILE* prof = & ProfileSectionStart

while (prof < & ProfileSectionEnd)
{
printf("La fonction %s a été appelée %d foisn", prof->function_name,
prof->num_calls);
prof++;
}