LD linker script sections

Gast #2577269
Ich hab ein Problem bei einem GNU LD linker script. Meine 
Speicherkonfiguration sieht so aus:
1
MEMORY 
2
{
3
  SDRAM_CACHED (wxai)     : ORIGIN = 0x20000000, LENGTH = 63M
4
  SDRAM_UNCACHED (wa)     : ORIGIN = 0x23F00000, LENGTH = 1M
5
  FLASH (rxai)            : ORIGIN = 0x00000000, LENGTH = 2M
6
  SRAM0 (wa)              : ORIGIN = 0x00200100, LENGTH = 16128
7
  SRAM1 (wa)              : ORIGIN = 0x00300000, LENGTH = 16k
8
}

In der elf Datei sieht das dann so aus:
1
  0 .text         00098c80  20000000  00000000  00008000  2**5
2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
3
  1 .data         0000c630  20098c80  00098c80  000a0c80  2**3
4
                  CONTENTS, ALLOC, LOAD, DATA
5
  2 .bss          000d86c0  200a52b0  200a52b0  000b52b0  2**3
6
                  ALLOC
7
  3 .heap         03d81e90  2017d970  2017d970  000b52b0  2**0
8
                  ALLOC
9
  4 .uncached     0001ec00  23f00000  23f00000  000b8000  2**10
10
                  CONTENTS, ALLOC, LOAD, DATA
11
  5 .sram1        00000018  00300000  00300000  000b0000  2**2
12
                  CONTENTS, ALLOC, LOAD, DATA

Das Problem ist nun, dass die Sektionen .uncached und .sram als contents 
und data deklariert sind. Wenn ich nun die elf Datei in eine binary 
umwandeln will, dann wird das riesengroß, weil die Sektionen .uncached 
und .sram1 auch mit kopiert werden, obwohl sie das nicht sollen. In 
diesen Sektionen liegen aber nur unintialisierte Daten, also müsste das 
gar nicht mit kopiert werden. Bis jetzt habe ich mir geholfen, in dem 
ich bei objcopy explizit diese Sektionen mit -R entferne. Ich würde das 
aber gern schon im linker script so deklarieren, das da keine Daten in 
diesen Sektionen drin liegen und sie deshalb nicht mit kopiert werden 
müssen. Es soll so deklariert sein wie die Sektion .bss. So habe ich die 
Sektionen sram1 und bss deklariert:
1
  .bss : 
2
  {
3
    * (.bss)
4
    * (.bss*)
5
    * (COMMON)
6
    
7
    . = ALIGN(16);
8
    
9
  } > SDRAM_CACHED
10

11
  .sram1 : 
12
  {
13
    * (.sram1)
14
    * (.sram1*)
15
   
16
    . = ALIGN(4);
17
  } > SRAM1

Beides sieht ziemlich gleich aus, aber die Sektionen verhalten sich 
unterschiedlich.
Bei einfacheren Controllern mit dem dort üblichen ROM/RAM Mix gibts in 
den Linker-Scripten beispielsweise sowas wie:

   _etext = . ;
  PROVIDE (etext = .);

  .data : AT (_etext)
  {
    *(.data)
    *(.data.*)
  } > RAM

  .bss (NOLOAD) :
  {
    *(.bss)
    *(.bss.*)
    *(COMMON)
  } > RAM

Das (NOLOAD) könnte dir helfen.
Gast
In dem Fall bewirkt der Befehl NOLOAD das die section in der elf Datei 
als "ALLOC" markiert wird. Das bedeutet, da liegen keine Daten drin, die 
von dem Befehl objdump beim Konvertieren in die Binärdatei geschrieben 
werden müssen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 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.