Forum: Compiler & IDEs Variable wird von falscher Adresse gelesen.


von Alex (0x41)


Lesenswert?

Hi Leute,
ich hab ein seltsamen Bug bei meiner FW (mcuxpresso ide).
Variablen aus einem crosscompelierten Archiv werden von falscher Adresse 
gelesen, obwohl diese an der richtigen Adresse vom linker platziert und 
vom Debugger gelesen/verändert werden können. Ich sehe diese auch im RAM 
an der richtigen Add stehen.
Wenn ich mir über einen Pointer die Add der Variable hole, dann zeigt 
dieser irgendwo hin. Auch außerhalb jedweder vorkommender Adresse.
Setze ich ein Static davor, funktioniert das Programm ohne Probleme.

Wird der c code im Projekt kompiliert, dann funktionier er auch wie er 
soll.
1
///////////////////////
2
//reduziertes beispiel
3
//cross compelierter code
4
Test.c
5
Uint8_t crossVar = 20; //Add 0xa000 0000 Image info bestätigt es auch.
6
7
Test.h
8
Extern Uint8_t crossVar;
9
//ende compelierter code
10
11
12
//main.c
13
#include "Test.h"
14
15
Main(){
16
uin8_t var;
17
uin8_t* pvar;
18
19
pvar = &crossVar; // zeigt irgendwohin. Add immer gleich bis neue kompiliert wird.
20
var = crossVar; // Ergebniss 0 oder absturz (sprung in hard fault)
21
22
if(crossVar)   //sprung in hard fault oder 
23
  var = 0;   
24
else
25
  var = 13; 
26
27
while(1)
28
  ++var;
29
30
}

Hat wer ein Tipp zur Lösung?

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Mal wieder Quell-Code ins Forum getippt?

Was ist: Uint8_t ?

Was ist: Uin8_t ?

von Harald K. (kirnbichler)


Lesenswert?

Alex schrieb:
> Variablen aus einem crosscompelierten Archiv werden von falscher Adresse
> gelesen

Was ist ein "crosscompeliertes Archiv"?

Wie werden Variablen aus einem Archiv gelesen?

von J. S. (jojos)


Lesenswert?

Test.c ist beim Linker angegeben? Map file aktivieren und gucken was 
darin steht.

von Alex (0x41)


Lesenswert?

Mit "crosscompeliertes Archiv" meine ich c Code, der von einer Anderen 
Plattform stand und von mir portiert wurde. Dieser wird über Skripte mit 
cmake und ide toolchain als Archive kompiliert und ins Projekt als lib 
eingebunden.

Die compile definitions und linker flags sind von mir im cmake file 
gesetzt.
Da ich so ein Bug noch nicht hatte wollte ich die Info nicht unter den 
Tisch fallen lassen. Mir fällt aber auch nichts ein was da falsch sein 
könnte un so einen Fehler zu verursachen.

Es werden mehrere Archive eingebunden. Der Fehler tritt schon bei init 
Funktionen des ersten Archiv(basis) auf, weiß also noch nicht, wie es 
bei anderen ist.

Ja die test.c und die variable crossVar werden in der map angegeben.

von J. S. (jojos)


Lesenswert?

Wenn der Code mit dem gleichen ABI kompiliert wurde sollte es eigentlich 
funktionieren. Die Lib kann man auch als Projekt in MCUXpresso bauen und 
im anderen Projekt referenzieren. Bei CMake muss man ja die Toolchain 
angeben, nicht das da eine falsche verwendet wurde. Aber da sollte ja 
der Linker meckern.

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.