Luminary 3s6965 Cortex-m3, Linker Problem

OP #1318202
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
}
Gast #1318608
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
Gast #1319671
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 ;)

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