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.