GCC: pourquoi des variables constantes ne sont pas placées dans .rodata

J'ai toujours cru que GCC serait static const variable .rodata segments (ou à .text segments pour des optimisations) d'un ELFE ou tel fichier. Mais il semble pas le cas.

Je suis actuellement à l'aide gcc (GCC) 4.7.0 20120505 (prerelease) sur un ordinateur portable avec GNU/Linux. Et c'est une constante statique variable .bss segment:

/*
 * this is a.c, and in its generated asm file a.s, the following line gives:
 *   .comm a,4,4 
 * which would place variable a in .bss but not .rodata(or .text)
 */
static const int a;

int main()
{
    int *p = (int*)&a;
    *p = 0;  /* since a is in .data, write access to that region */
             /* won't trigger an exception */
    return 0;
}

Donc, est-ce un bug ou une fonctionnalité? J'ai décidé de déposer ce qu'un bug sur bugzilla, mais il pourrait être préférable de demander de l'aide en premier.

- Il que GCC ne pouvez pas placer une variable const dans .rodata?

Mise à JOUR:

Testé, une constante variable avec une initialisation explicite(comme const int a = 0;) serait placé dans .rodata par GCC, alors que j'ai quitté la variable non initialisée. Ainsi, cette question pourrait être fermé plus tard, je n'ai pas de présenter une bonne question, peut-être.

Aussi, dans mon précédent mots, j'ai écrit que la variable a est placé dans '.les données de la section, ce qui est incorrect. C'est en fait placé dans .bss section depuis pas initialisé. Le texte ci-dessus est maintenant corrigé.

  • En C++, vous pouvez initialiser un const variable à partir d'une valeur qui n'est pas une constante de compilation. Mais j'ai vérifié, et GCC ne permet pas que comme une extension en C en mode.
  • En C, vous pouvez également écrire ce légalement: void test(int a){ const int b = a; /* ... */ }. Je suis en train de me demander si une constante globale de la variable doit être des lieux dans une mémoire en lecture seule de la région.
  • FWIW, il est en lecture seule section si vous initialiser explicitement.
  • Oh.. je suis.. tellement stupide, et, grandement reconnaissant!
  • Il y a bien toujours quelque chose de louche. AFAICT, en initialisant à 0 ne change pas le programme, qui static var doit être initialisé à zéro si vous n'avez pas explicitement de le faire. Si quelque chose se passe. (clang met dans un RO section indépendamment de l'initialisation.)
  • static const int a; n'est même pas légal, je pense - les constantes doivent avoir un initialiseur.
  • Aussi, les erreurs de programmation en C++ ne sont pas "déclencher des exceptions". Les Exceptions font partie de la programmation correcte, pas des outils de débogage.
  • Enfin, dans le meilleur des variables statiques de durée de stockage qui sont initialisées dans la statique de la phase d'initialisation sont admissibles pour les mettre dans un segment en lecture seule. "L'expression constante" est le terme pertinent.
  • RE static const int a; peut ne pas être légal: n'est-elle pas constituer une tentative de définition et de se comporter comme au §6.9.2 (c'est à dire tant qu'il n'y a pas de conflit, se comporte comme si elle avait un zéro de l'initialiseur)?
  • C est pas du C++. static const int a; est parfaitement légal C.
  • Non constants initialiseurs sont parfaitement légales en C pour les non-objets statiques (c'est à dire, les objets définis à l'intérieur d'une fonction sans la static mot-clé): const int r = rand();. Non constants initialiseurs ne sont pas autorisés pour les objets statiques. La présence ou l'absence de const n'a pas d'importance; en C, const moyens en lecture seule, pas de "constante".

InformationsquelleAutor starrify | 2012-05-30