Luminary 3s6965 Cortex-m3, Linker Problem

OP #1318202
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
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.
Gast
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.