Forum: Mikrocontroller und Digitale Elektronik Luminary 3s6965 Cortex-m3, Linker Problem


von Oliver R. (oliverr)


Lesenswert?

Hallo,
ich experimantiere gerade etwas mit obigen Controller. Dabei benutze ich 
den Codesourcery-lite Compiler. Ich bin gerade dabei ein bisschen was in 
Festkommaarithmetik auszuprobieren. Dabei benutzte ich öfters 64bit 
Operationen. Teilweise bekomme ich dann einen Linker Fehler:

section .ARM.exidx [00020b6c -> 00020b73] overlaps section .data

Der Fehler kommt nicht immer, sondern nur bei 64bit Operationen, da aber 
auch nur sporadisch. Bisher habe ich das Problem durch Codeumsortieren 
beheben können. Bei dieser Funktion ist mir das aber bisher nicht 
gelungen.

Als Linker-script verwende ich die Beispiele von Luminary.

Ich hoffe, jemand von Euch kennt sich mit dem Linker aus, und kann mir 
weiterhelfen?

Dank und Grüße
Oliver
1
#define norm 20
2
int divN(int z1, int z2){
3
  long long z3;
4
  z3 = (long long)z1 << 32 ;
5
  z3 = (z3/z2) >> (32-norm); // ACHTUNG: Hier gibts wieder den exidx-Fehler
6
  return  z3;
7
}

von GNU Meister (Gast)


Lesenswert?

Poste mal das Makefile und das Linkerskript.
Die Section exidx ist eigentlich für die Exceptions. Brauchst Du die?
Sonst probier mal -fno-exceptions bei den Flags.

von Oliver R. (oliverr)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe es (-fno-exceptions) bei den CFLAGS (makedefs) dazugeschrieben. 
Ändert leider auch nichts.

Grüße
Oliver

von Linus Torvald (Gast)


Lesenswert?

Problematisch ist folgende Section im Linkerfile:
1
 .data : AT(ADDR(.text) + SIZEOF(.text))
2
    {
3
        _data = .;
4
        *(vtable)
5
        *(.data*)
6
        _edata = .;
7
    } > SRAM

AT und > zu mischen, kann zu diesen Fehler führen.
1
Versuch mal sowas wie
2
 .data :
3
    {
4
        _data = .;
5
        *(vtable)
6
        *(.data*)
7
        _edata = .;
8
    } > SRAM AT>FLASH

von Oliver R. (oliverr)


Lesenswert?

Vielen Dank,

Damit lief der Compiler durch. Was mich jetzt aber doch interessiert, 
ist, was ist eigentlich der Unterschied? Ich bin leider völlig blank, 
was die Linker-Konfiguration anbelangt.

Grüße
OR

von Michael (Gast)


Lesenswert?

Also ich bin jetzt kein Profi und beschäftige mich erst seit ein paar 
Monaten mit der M3-Programmierung, aber ich denke, daß die Ursache und 
der Unterschied wie folgt sind:

In Deinem Skript hast Du in der Section .text sowohl *(.text*) als auch 
*(.rodata*), legst .data aber an die Adresse
1
   ADDR(.text) + SIZEOF(.text).
Meiner Meinung nach müßte das aber
1
   ADDR(.text) + SIZEOF(.text) + SIZEOF(.rodata).
heißen. Sobald Konstanten im Programm genutzt werden, müßte dann der 
Fehler kommen.

Mit dem Ausdruck von Linus
1
   > SRAM AT>FLASH
überläßt Du dem Linker die korrekte Berechnung.
In Deinem Fall ist die manuelle Berechnung ja auch nicht nötig. 
Eleganter ist dann in der Tat der Ausdruck von Linus.

Das Ganze aber ohne Gewähr.
Wäre aber schön, wenn Du das mal ausprobierst, mich würde das Ergebnis 
interssieren ;)

von Oliver R. (oliverr)


Lesenswert?

Hallo,

Vielen Dank für Deine Erklärung.

Mit dem Hinweis von Linus funktioniert. Mit Deiner Änderung bekomme ich 
wieder den exidx-Fehler.

Dank und Grüße
Oliver

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.