mikrocontroller.net

Forum: Compiler & IDEs Defaultsection für Variablen und Code ändern


Autor: Michu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann man die Defaultsection für Code und Variablen ändern? Der Code 
soll statt in .text in .ktext landen. Analog die Variablen. Der alte 
Compiler (Diab) hatte dafür ein #pragma section:
#ifdef BOOTLOADER
  #pragma section DATA   ".kdata" ".kbss"  far-absolute RW
  #pragma section CONST  ".ktext" ".ktext" far-absolute R
  #pragma section STRING ".ktext"          far-absolute R
  #pragma section CODE   ".ktext"          standard     RX
#endif

Die betroffenen Module wurden zweimal übersetzt, einmal mit definiertem 
BOOTLOADER. Das Ergebnis war ein ROM Image mit Bootloader plus 
Applikation.

Kann man das auch mit dem GCC? Der einige Weg, den ich bis jetzt 
gefunden habe, ist jede einzelne Variable und Funktion mit _attribute_ 
((section (".somesection"))) zu dekorieren.

Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
ja, das kann man. da die platzierung sache des linkers ist, musst du 
dazu ein angepasstes linker-script verwenden. am besten du schaust dir 
einfach die mit den binutils gelieferten scripte an. wenn du bloss einen 
buchstaben davor packen willst, sollte das ja kein großer akt sein.
einbinden des neuen scripts dann über den -T - schalter des linkers.
bye kosmo

Autor: Michu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soweit bin ich schon gekommen. Ich habe ein angepasstes Linkerskript. 
Meine Frage ist nun, wie ich erreichen kann, dass alle Funktionen und 
Variablen eines Moduls in die neu definierten Sections kommen. Ich 
möchte die Defaultsection einmal angeben, satt bei jeder Funktion oder 
Variable die Section angeben zu müssen. Der folgende Code ist ja nicht 
sehr übersichtlich...
#ifdef BOOTLOADER
int i __attribute__ ((section (".kbss")));
#else
int i;
#endif;

#ifdef BOOTLOADER
int foo(int bar)  __attribute__ ((section (".ktext")));
#else
int foo(int bar);
#endif;

Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
per default packt der gcc alles fein säuberlich in die sections .text, 
.data und .bss . das linker-script kommt beim abschliessendem linken zum 
tragen und sammelt diese sections quasi ein.

mal ein beispiel suchen geh ..
/* Internal text space or external memory */
  .c_appl_text : /* place everything in this section */
  {
        *(.vectors)
     __ctors_start = . ;
     *(.ctors)
     __ctors_end = . ;
     __dtors_start = . ;
     *(.dtors)
     __dtors_end = . ;
    KEEP(SORT(*)(.ctors))
    KEEP(SORT(*)(.dtors))
[..]
    *(.text)
    . = ALIGN(2);
    *(.text.*)
    . = ALIGN(2);
[..]
   *(.fini0)  /* Infinite loop after program termination.  */
    KEEP (*(.fini0))
     _etext = . ;
  }  > text
diese section sammelt alle .text-sections aus den object-files auf (und 
noch vieles mehr) und platziert sie in einer eigenen section 
(.c_appl_text ). und so landet es dann im .elf-file. nachzuprüfen mit 
readelf.

deine defines kannst du da natürlich nicht verwenden, dass geht nur über 
den schalter beim gcc-aufruf (besser: linker-aufruf).

sonst lies dir doch einmal die anleitung zum "ld" durch, die ist meines 
erachtens sehr aussagekräftig. oder bei fragen einfach fragen. oder du 
zeigst einmal dein linker-script, und die gemeinde wirft einmal einen 
blick drauf.

bye kosmo

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  Meine Frage ist nun, wie ich erreichen kann, dass alle Funktionen und
> Variablen eines Moduls in die neu definierten Sections kommen.

Mit objcopy kannst du ein Objectfile oder auch ein ganzes Archiv in ein 
neues kopieren und dabei auch Sektionen umbenennen (--rename-section 
<old>=<new>). Da kannst du z.B. angeben, daß die Sektion .text in .ktext 
umbenannt werden soll.

Autor: Michu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut ich werde das mit dem objcopy mal versuchen. Wir haben hier Module, 
welche vom Bootloader und der Applikation verwendet werden. Diese wurden 
jeweils 2 mal übersetzt. Einmal landet der Code in .text, einmal in 
.ktext. Alle öffentlichen Referenzen (z.B. Funktionsnamen) wurden im 
Fall "Bootloader" mit Hilfe des Präprozessors umbenannt, damit es beim 
Linken keinen Konflikt gab.

Ich werde mal versuchen, die Module (oder die ganzen Bibliotheken) des 
Bootloaders nach dem Kompilieren mit dem objcopy zu bearbeiten...

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.