www.mikrocontroller.net

Forum: Compiler & IDEs .o Datei ins .Data Section!


Autor: Jepp Noo (Firma: imbiss) (whd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Habe mehrere .o Dateien und die sollen in zum Beispiel .Text, .Data oder 
.mySection gelinkt werden. Kann mann aus der Kommando Zeile den Linker 
erzwingen dass er sowas tut oder muss den default Linker-Script 
verändert werden?

Die Target Hardware ist ein MSP430 mit dem gcc Kompiler.

Wäre super wenn ihr mir paar Tipps gibt.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst keine ganze Datei in eine section stopfen.  Die einzelnen
sections sind bereits innerhalb der Datei aufgelistet.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Du kannst keine ganze Datei in eine section stopfen.

Mit einem entsprechenden Linkerskript geht das schon. Ich wüßte nur 
nicht, wozu es gut sein soll, alles aus einer .o-Datei in eine einzelne 
Sektion zu stecken.

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann zumindest per Linker-Script näher spezifizieren welche 
"C-Section" eines Object-Files in welche "Linker-Section" aufgenommen 
werden soll. Aus einerm Beispiel für ARM Ausschnitte aus einem 
Linker-Script für GNU ld (Prinzip sollte für alle Targets funktionieren, 
auch für msp430-ld):
SECTIONS
{
  .text :
  {
     ...
     *(EXCLUDE_FILE (*7xx_flash*.o) .text .text.*)
     ...
   } >CODE =0
   ...

  .data : AT (_etext)
  {
    ...
    *7xx_flash*.o(.text .text.*)
    ...
  } >DATA
   ...

Damit wird Programmcode (text) aus allen Object-Dateien ausser 7xx_flash 
auf Addressen im CODE-memory gelinkt. Programmcode aus 7xx_flash.o 
erhalten eine VMA im DATA-memory. Im Beispiel dient dies dazu, dass die 
Funktionen aus 7xx_flash.c im RAM ausgeführt werden, dies ist 
erforderlich, da der Controller beim Schreiben des Flash-Speichers 
keinen Code aus dem Flash ausführen kann.

Autor: Jepp Noo (Firma: imbiss) (whd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Programmiere momentan an einem Bootloader und da möchte ich dass nur die 
Firmware in das .Text Section kommt. Das eigentliche Code für das 
Bootloader wie z.B. eraseFlash() oder writeFalsh() sollen aus dem RAM 
ausgeführt weden. Deswegen habe ich sowas wie FlashTeiber.o erzeugt un 
die soll nun ins RAM. Das ist meine Intuition.

Der standard Linker Script speichert den Code immmer ins .Text und genau 
dass möchte ich jetzt ändern. Wüßte zu gern wie das mit dem ld 
kunktioniert

Autor: Jepp Noo (Firma: imbiss) (whd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Hab den Linker Script wie folgt geändert
  .text :
  {
    . = ALIGN(2);
    *(.init)
    *(.init0)  /* Start here after reset.  */
    *(.init1)
    *(.init2)  /* Copy data loop  */
    *(.init3)
    *(.init4)  /* Clear bss  */
    *(.init5)
    *(.init6)  /* C++ constructors.  */
    *(.init7)
    *(.init8)
    *(.init9)  /* Call main().  */
     __ctors_start = . ;
     *(.ctors)
     __ctors_end = . ;
     __dtors_start = . ;
     *(.dtors)
     __dtors_end = . ;
    . = ALIGN(2);
    *(.text)
    . = ALIGN(2);
    *(.text.*)
    . = ALIGN(2);
    *(.fini9)  /*   */
    *(.fini8)
    *(.fini7)
    *(.fini6)  /* C++ destructors.  */
    *(.fini5)
    *(.fini4)
    *(.fini3)
    *(.fini2)
    *(.fini1)
    *(.fini0)  /* Infinite loop after program termination.  */
    *(.fini)
    _etext = .;
    *(EXCLUDE_FILE (*whdh*.o) .text .text.*)
  }  > text
  .data   : AT (ADDR (.text) + SIZEOF (.text))
  {
     PROVIDE (__data_start = .) ;
    . = ALIGN(2);
    *(.data)
    . = ALIGN(2);
    *(.gnu.linkonce.d*)
    . = ALIGN(2);
     _edata = . ;  
    *whdh*.o(.text .text.*)
}  > data

es lässt sich auch fehlerfrei kompilieren nur die enstprechen Funktionen 
liegen immer noch in der .Text Section. Was könnte an dem Obigen 
Script-Abschnitt fehlerhaft sein ?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du fummelst IMHO an der falschen Stelle. Durch ein attribute bei den 
Funktionsdefinitionen, kannst du veranlassen, dass diese automatisch 
oder manuell in den Wunschsektionen z.B. im RAM landen. Siehe auch 
Beitrag "MSP430 C-Funktionen vom RAM ausführen?"

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
section-Attribute ist sicher auch brauchbar. Ansonsten mal dies 
versuchen:
 .text :
  {
    . = ALIGN(2);
    *(.init)
    *(.init0)  /* Start here after reset.  */
    *(.init1)
    *(.init2)  /* Copy data loop  */
    *(.init3)
    *(.init4)  /* Clear bss  */
    *(.init5)
    *(.init6)  /* C++ constructors.  */
    *(.init7)
    *(.init8)
    *(.init9)  /* Call main().  */
     __ctors_start = . ;
     *(.ctors)
     __ctors_end = . ;
     __dtors_start = . ;
     *(.dtors)
     __dtors_end = . ;
    /* ----- */
    . = ALIGN(2);
    *(EXCLUDE_FILE (*whdh*.o) .text)
    . = ALIGN(2);
    *(EXCLUDE_FILE (*whdh*.o) .text.*)
    /* ----- */
    . = ALIGN(2);
    *(.fini9)  /*   */
    *(.fini8)
    *(.fini7)
    *(.fini6)  /* C++ destructors.  */
    *(.fini5)
    *(.fini4)
    *(.fini3)
    *(.fini2)
    *(.fini1)
    *(.fini0)  /* Infinite loop after program termination.  */
    *(.fini)
    _etext = .;
  }  > text
  .data   : AT (ADDR (.text) + SIZEOF (.text))
  {
     PROVIDE (__data_start = .) ;
    . = ALIGN(2);
    *(.data)
    . = ALIGN(2);
    *(.gnu.linkonce.d*)
    . = ALIGN(2);
    *whdh*.o(.text)
    . = ALIGN(2);
    *whdh*.o(.text.*)
    . = ALIGN(2);
     _edata = . ;  
}  > data

Autor: Jepp Noo (Firma: imbiss) (whd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Danke Martin für deine Hilfe. Es läuft super.

Natürlich habe ich das mit dem
void __attribute__ ((section(".data"))) flash_write_block(int)

und das funktioniert. Warum sollte man nicht den Umweg über dem Linker 
Script nehmen !!?

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Section attribute und die gezeigte Modifikation im Linker-Script sind 
"doppelt-gemoppelt", könnte sogar sein, dass es mit beidem unangenehme 
Seiteneffekte gibt. Noch nie zusammen ausprobiert und, da ich kein 
MSP430 Board habe, erst recht nicht mit MSP.

Ein Vorteil bei dem gezeigten Ansatz mit Linker-Skript ist, dass man im 
C-Code keine herstellerspezifischen Erweiterungen verwenden muss. Dies 
ist dann nützlich, wenn man Code von Dritten unverändert wiederverwenden 
will. Ich konnte z.B. für eine ARM-Entwicklung den Flash-Code von ST für 
STR710 ohne Änderung übernehmen, da EWARM im Prinzip den gleichen Ansatz 
nutzt, um Routinen an eine RAM VMA zu linken. Ein Nachteil ist, dass man 
sich mit Linker-Scripts rumschlagen muss, was nicht jedermanns Sache 
ist.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.