Autor Thema: Speicherkonflikte durch LD  (Gelesen 4580 mal)

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« 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
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 06. January 2010, 22:14 »
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.
Dieser Text wird unter jedem Beitrag angezeigt.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 06. January 2010, 22:33 »
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.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 07. January 2010, 05:55 »
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.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 07. January 2010, 12:25 »
Habe das Problem gelöst.
Es lag an dem Stack, den ich vom Bootloader bekomme (ARM-Architektur).
Der lag unter dem __end-Symbol
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

 

Einloggen