2017-02-13 1 views
0

J'essaie de compiler une application pour un OS personnalisé que j'écris pour le ARM Cortex M0 +. L'application est écrite en C. J'ai une variable globale, int newInt = 4; défini au sommet de mon code. Le reste de l'application appelle simplement une fonction d'impression pour imprimer la valeur de cette variable. Cependant, il a continué à s'écraser. Pour le vérifier, j'ai plutôt imprimé l'adresse de la variable, newInt. Il était bien en dehors de la carte mémoire valide de la puce, d'où la raison pour laquelle il s'est écrasé.Pourquoi gcc place mes données globales dans la mauvaise adresse?

Mon script de liaison est simple:

SECTIONS 
{ 
    . = 0x20001580; 
    .text : 
    { 
     _text = .; 
     *(.text) 
     _etext = .; 
    } 
    .data : 
    { 
     _data = .; 
     KEEP(*(.data)) 
     _edata = .; 
    } 
    .bss : 
    { 
     _bss = .; 
     *(.bss) 
     _ebss = .; 
    } 
} 

Maintenant, le segment .text est placé correctement, à partir de 0x20001580. Cependant, l'adresse de ma variable globale, qui DEVRAIT être quelque part autour de cette valeur (0x20001580 ou plus, plus la taille du code, qui est d'environ 40 octets), est actuellement placée à 0x18060, ce qui pour moi est totalement adresse aléatoire. Ainsi, chaque fois que j'essaie d'accéder à la valeur de newInt, le code essaie d'accéder à une adresse de mémoire hors de portée, et il échoue.

Est-ce que newInt ne doit pas être placé dans le segment .data? Si c'est le cas, pourquoi le segment .data se trouverait-il dans un endroit si étrange, étant donné mon script d'éditeur de liens?

Répondre

0

Cela pourrait être utile à d'autres personnes plus tard:

Le problème réside dans mon processus de liaison. Afin de le faire fonctionner, j'ai dû compiler mon application en utilisant le drapeau -c, pour obtenir le bon fichier de sortie. ALORS lien contre la sortie de gcc. J'ai essayé de faire la compilation et la liaison en une étape et quelque chose s'est mal passé quand cela a été fait.