Forum: Compiler & IDEs variable im mapfile


von Gaehn... (Gast)


Lesenswert?

Moin,
irgendwie funktioniert mein Gehirn heute nicht so richtig...:

Im mapfile werden doch zur Compilezeit die bekannten "Objekte" angelegt?
Wenn es also z.B. eine Variable my_var gibt (von mir aus sogar global, 
außerhalb main), wird sie (zumindest im Debug) auch wirklich erzeugt. 
Dann muß doch zur Compilezeit schon RAM dafür zugewiesen werden und 
my_var im mapfile mit Speicheradresse und Speicherverbrauch auftauchen? 
Tut sie aber nicht...
Alle anderen Randbedingungen (arm-none-eabi-c++ usw.) sollten da ja 
wirklich keinen Einfluß bei dieser Grundsatzfrage haben.

von Andreas M. (amesser)


Lesenswert?

Nein.

Wenn die Variable nicht benutzt wird, dann wird der Linker diese nicht 
mit ins elf aufnehmen. Ausnahme: In der gleichen Datei sind noch andere 
statische oder globale Variablen, die im gleichen Segment 
(.bss/.data/.rodata) liegen, welche irgendwo referenziert werden. (Der 
Linker kann keine Sections aus einer Datei zerstückeln)

Wenn die Variable eine statische Konstante ist, dann könnte der Compiler 
diese eventuell schon entsorgen.

Wenn man zusätzlich noch LTO benutzt dann kann es noch anders laufen: 
der Linker könnte die Variable wegoptimieren, obwohl sie referenziert 
wird :-)

: Bearbeitet durch User
von Gaehn... (Gast)


Lesenswert?

Danke, die Argumente kann ich nachvollziehen. Aber konkret hier sollte 
ja nichts davon zutreffen:
1
#include <stdint.h>
2
3
int main (void)
4
   {
5
      uint32_t loc_var1;
6
      uint32_t loc_var2 = 8;
7
8
      loc_var1++;
9
      loc_var2++;
10
      uint32_t addr = reinterpret_cast<uint32_t>(&loc_var1);
11
      addr++;
12
   }

Es gibt eine Warnung, daß loc_var1 uninitialisiert verwendet wird, was 
ja auch gut und richtig ist.

Aber alle 3 Variablen werden aus Sicht des Compilers und Linkers auch 
verwendet (nach meinem Verständnis, und unused_warnings gibt es auch 
nicht). Es ist also klar, daß es diese 3 Variablen im Programm verwendet 
werden und somit garantiert Speicher brauchen. Und daher hätte ich 
erwartet, daß sie im mapfile auftauchen.
Da sie das aber nicht tun, hatte ich bisher wohl eine falsche 
Vorstellung der statischen "Speicherauslastungsberechnung".

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Das sind alles lokale Variablen die auf dem Stack angelegt werden. Die 
tauchen im mapfile nicht auf.

von dummschwaetzer (Gast)


Lesenswert?

wenn du sie als static initialisierst, sollten sie da sein

von Gaehn... (Gast)


Lesenswert?

Ah, ..., natürlich. Dann kann ich das ja nur im Degubber sehen.
Ich habe daraufhin jetzt das hier gefunden: 
https://www.keil.com/support/man/docs/armclang_intro/armclang_intro_hla1474359990839.htm
Das bringt mich weiter.
Vielen Dank.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.