Forum: Compiler & IDEs LD linker script sections


von ... (Gast)


Lesenswert?

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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Stimmen die Section-Flags? Bei .bss ist das zB @nobits

von (prx) A. K. (prx)


Lesenswert?

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.

von ... (Gast)


Lesenswert?

Das (NOLOAD) funktioniert! Danke.

von Lowtzow .. (lowtzow)


Lesenswert?

was genau bewirkt der befehl noload?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wenn alles andere versagt hat, lies die Dokumentation!

http://sourceware.org/binutils/docs/ld/Output-Section-Type.html

von ... (Gast)


Lesenswert?

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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

ALLOC und NOLOAD sind unabhängig bis auf

!ALLOC => NOLOAD

d.h. etwas, das keinen Platz belegt, muss nicht geladen werden.

Die Umkehrung gild aber nicht:

Etwas, das nicht geladen wird/werden muss, kann durchaus Platz belegen.
Beispiel: .bss

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.