Lowlevel
Lowlevel => Softwareentwicklung => Thema gestartet von: rizor am 06. January 2010, 22:05
-
Nabend zusammen,
ich habe ein Linker-Script bei dem ich am Ende den Speicher auf ein MB linke und ein Symbol für das Ende des Kernels erhalte.
Direkt danach lege ich meine Speicherverwaltung.
Nun ist mir aufgefallen, dass ein char* mit 1024 Einträgen über das Symbol des Kernels hinausreicht.
Woran kann das liegen?
Also das Symbol liegt auch wirklich am Ende des Scripts.
Ich bin momentan echt überfragt.
Der Linker legt das char* immer üer die grenze hinaus.
Egal ob ich den Kernel auf 4k aligne oder auf 1 MB.
Danke für eure Hilfe.
gruß
rizor
-
Vielleicht hast du eine wichtige Sektion vergessen im Linkerskript zu erwähnen, und LD hängt die einfach hinten ran. Ohne das Skript zu sehen kann ich da aber nur raten.
-
Das Skript sieht wie folgt aus:
SECTIONS
{
__start = .;
.text 0x20000000 :
{
__btext = .;
*(.text)
__etext = .;
}
.data :
{
__bdata = .;
*(.data)
__edata = .;
}
.bss :
{
*(.bss)
*(COMMON)
}
. = ALIGN(1 << 12);
__end = .;
}
Wüsste jetzt nicht was fehlt.
Ein rodata hat auch nichts gebracht.
-
Da fehlt *(.rodata*) im .text Teil. Mit objdump -x <kernel.elf> kannst du dir übrigens auch die Sektionen des Kernels anzeigen lassen, dann weißt du genau welche Sektion da fies am Ende heraussticht.
-
Habe das Problem gelöst.
Es lag an dem Stack, den ich vom Bootloader bekomme (ARM-Architektur).
Der lag unter dem __end-Symbol