Variable wird von falscher Adresse gelesen.

OP #7521114
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?

OP #7521305
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.

#7521339
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren