Dans quel segment (.BSS, .DATA, autre) d'un fichier exécutable les variables statiques sont-elles stockées afin qu'elles n'aient pas de collision de noms ? Par exemple :
foo.c: bar.c:
static int foo = 1; static int foo = 10;
void fooTest() { void barTest() {
static int bar = 2; static int bar = 20;
foo++; foo++;
bar++; bar++;
printf("%d,%d", foo, bar); printf("%d, %d", foo, bar);
} }
Si je compile les deux fichiers et que je les lie à un main qui appelle fooTest() et barTest à plusieurs reprises, les instructions printf s'incrémentent indépendamment. C'est logique puisque les variables foo et bar sont locales à l'unité de traduction.
Mais où le stockage est-il alloué ?
Pour être clair, l'hypothèse est que vous avez une chaîne d'outils qui produirait un fichier au format ELF. Ainsi, je croire qu'il y a a il doit y avoir un espace réservé dans le fichier exécutable pour ces variables statiques.
Pour les besoins de la discussion, supposons que nous utilisons la chaîne d'outils GCC.
3 votes
La plupart des gens vous disent qu'ils doivent être stockés dans la section .DATA au lieu de répondre à votre question : où se trouve exactement la section .DATA et comment la trouver. Je vois que vous avez déjà marqué une réponse, donc vous savez déjà comment la trouver ?
0 votes
Pourquoi l'initialisé et le non-initialisé sont placés dans des sections différentes : linuxjournal.com/article/1059
3 votes
Le stockage alloué à vos variables globales/statiques au moment de l'exécution n'a rien à voir avec la résolution de leur nom, qui a lieu au moment de la construction/liaison. Une fois que l'exécutable a été construit, il n'y a plus de noms.
5 votes
Cette question n'a aucun sens, car elle est construite sur la fausse prémisse que la "collision de noms" de symboles non exportés est une chose qui peut exister. Le fait qu'il n'y ait pas de question légitime peut expliquer le caractère désastreux de certaines réponses. C'est difficile de croire que si peu de gens ont compris.