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


von Michu (Gast)


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.

von kosmonaut pirx (Gast)


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

von Michu (Gast)


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;

von kosmonaut pirx (Gast)


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

von Rolf Magnus (Gast)


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.

von Michu (Gast)


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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.