Defaultsection für Variablen und Code ändern

Gast #633290
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:
1
#ifdef BOOTLOADER
2
  #pragma section DATA   ".kdata" ".kbss"  far-absolute RW
3
  #pragma section CONST  ".ktext" ".ktext" far-absolute R
4
  #pragma section STRING ".ktext"          far-absolute R
5
  #pragma section CODE   ".ktext"          standard     RX
6
#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.
Gast #633309
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
Gast #633370
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...
1
#ifdef BOOTLOADER
2
int i __attribute__ ((section (".kbss")));
3
#else
4
int i;
5
#endif;
6

7
#ifdef BOOTLOADER
8
int foo(int bar)  __attribute__ ((section (".ktext")));
9
#else
10
int foo(int bar);
11
#endif;
Gast #633381
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 ..
1
/* Internal text space or external memory */
2
  .c_appl_text : /* place everything in this section */
3
  {
4
        *(.vectors)
5
     __ctors_start = . ;
6
     *(.ctors)
7
     __ctors_end = . ;
8
     __dtors_start = . ;
9
     *(.dtors)
10
     __dtors_end = . ;
11
    KEEP(SORT(*)(.ctors))
12
    KEEP(SORT(*)(.dtors))
13
[..]
14
    *(.text)
15
    . = ALIGN(2);
16
    *(.text.*)
17
    . = ALIGN(2);
18
[..]
19
   *(.fini0)  /* Infinite loop after program termination.  */
20
    KEEP (*(.fini0))
21
     _etext = . ;
22
  }  > 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
Gast #634070
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.
Gast #634115
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

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.

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.