Autor Thema: eine Datei - verschiedene Adressen  (Gelesen 4822 mal)

Krox

  • Beiträge: 38
    • Profil anzeigen
    • Coding42.de
Gespeichert
« am: 13. April 2006, 17:57 »
Nachdem ich es nicht in der Doku von ld gefunden habe (obwohl es bestimmt drin steht) nun hier meine Frage: Wie kann ich verschiedene Sections einer Datei an verschiedene Stellen linken? Ich benutze nämlich einen loader, der paging anschaltet und dann die ersten paar MB sowohl nach 0x00 als auch nach 0xC0000000 mappt. Der restliche Kernel soll dann aber in diesem hohen  Speicherbereich ausgeführt werden (ich hoffe, ihr versteht was ich meine :roll: ). ich habe jetzt schon so etwas ausprobiert: SECTIONS
{
.loader 0x100000 : { loader.o }
.kernel 0xC0000000 : { kernel.o }
}
So füllt ld allerdings die Datei mit viiiieelen Nullen aus, und sie wird fast 3 GB groß  :? . Ich möchte aber, das ld die Symbole behandelt, als ob sie an diesen Adressen wären. ld soll sie nicht wirklich dahin legen  :D

ich hoffe, ihr könnt mir helfen
21 ist nur die halbe Wahrheit

maumo

  • Beiträge: 182
    • Profil anzeigen
    • http://maumo.50webs.com/
Gespeichert
« Antwort #1 am: 13. April 2006, 22:02 »
versuch mal:

section virtuelleaddresse : AT(physischeaddresse) { ... }

also z.B.:

.loader 0x100000 : AT (0x00100000)
{
  Loader: .;
  loader.o
  EndLoader: .;
}

.kernel 0xC0000000 : AT (0x00100000 + (Kernel - Loader))
{
  Kernel: .;
  kernel.o
  EndKernel: .;
}


oder so ähnlich. die labels sind dazu da, um die physische addresse vom kernel zu berechnen. das image beginnt hier bei 1mbyte.
habs jez ma so ausm kopf gemacht un nicht getestet, also bitte nicht köpfen, wenn was falsch sein sollte :D

maumo

Krox

  • Beiträge: 38
    • Profil anzeigen
    • Coding42.de
Gespeichert
« Antwort #2 am: 13. April 2006, 22:30 »
Ja, so (ähnlich) funktioniert's. :) danke für die schnelle Hilfe

mein Endresultat sieht jetzt so aus:SECTIONS
{
loader 0x00100000 : AT(0x00100000)
{
_loader = .;
obj/loader.obj
_loaderEnd = .;
}

kernel 0xC0100000 + SIZEOF(loader) : AT(0x00100000 + SIZEOF(loader))
{
_kernel = .;
obj/*.obj
_kernelEnd = .;
}
}
21 ist nur die halbe Wahrheit

 

Einloggen