Zugriff auf Linker interne "Variablen"..?

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Zugriff auf Linker interne "Variablen"..?

Beitrag von Dirty Oerti » Fr Jul 25, 2008 11:38 pm

Tag! :)

Die Frage hängt mal wieder mit meinem kernel-Projekt zusammen.
Ich weiß nicht, ob ich mit meiner Vermutung, wie ich an die Größe meines Kernels komme richtig liege.
Aber ich hoffe schon.

Was ich machen will:

Ich möchte das Ende (die letzte Position im Speicher) des Kernels ausfindig machen.
Dazu hab ich mir überlegt: Das weiß doch der Linker.

Ich hab das irgendwo schon mal gesehen, ich finds nur leider nicht mehr (zu dumm, dass das Internet so groß ist...).

Ein Linkerskript sieht ja zum Beispiel so aus:

Code: Alles auswählen

ENTRY(start)
OUTPUT_FORMAT(elf32-i386)

SECTIONS
{
    . = 0x100000;
    .text :
{
        *(.text)
}

    .data :
{
        *(.data)
        *(.rodata)
}

    .bss :
{
        *(.bss)
}
    __kernel_end = .;
    end = .;
}
"__kernel_end" bezeichnet hier die letze Speicherpostion, die vom Kernel gebraucht wird.
An diesen Wert muss ich rankommen.

So einfach wie

Code: Alles auswählen

unsigned long k_ende = __kernel_end;
geht's leider nicht.
Da wird mir gemeldet:
Fehler: »__kernel_end« nicht deklariert (erste Benutzung in dieser Funktion)
Ich hab auch schon versucht, "__kernel_end" zu deklarieren.
Zum Beispiel per

Code: Alles auswählen

extern void *__kernel_end;
.
Funtioniert auch nicht.
Dann mekert der Linker, dass er "__kernel_end" nicht finden kann.

Also: Wie mach ich das?
Wie komm ich an diese Variable/Konstante/was-auch-immer "__kernel_end" ran?

MfG
Daniel :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Zugriff auf Linker interne "Variablen"..?

Beitrag von Dirty Oerti » Fr Jul 25, 2008 11:45 pm

Hm...
ich scheine das Problem gelöst zu haben.

Bin mehr oder minder zufällig auf diese Seite hier gestoßen:

http://sourceware.org/binutils/docs/ld/ ... -Reference

Es sieht nun so aus:

Linkerskript:

Code: Alles auswählen

ENTRY(start)
OUTPUT_FORMAT(elf32-i386)

SECTIONS
{
    . = 0x100000;
    .text :
{
        *(.text)
}

    .data :
{
        *(.data)
        *(.rodata)
}

    .bss :
{
        *(.bss)
}
    __kernel_end = .;
    end = .;
}
C-Code:

Code: Alles auswählen

extern int end;
//...
unsigned long k_ende = end;
//...
Wie man sieht bin ich auf "end" umgestiegen. Ist das gleiche. Nur bei "__kernel_end" hätte ich nicht gewusst, wie ich mit den doppelten Unterstrichen zu verfahren habe (wahrscheinlich nur einer weg).

Ob das ganze nun auch funktioniert weiß ich nicht.
Muss ich erstmal testen (das dauert immer etwas, da ich keine Zahlen ausgeben kann^^)

MfG
Daniel


*edit*
Hab's jetzt mal getestet.
Ernüchternd.

Code: Alles auswählen

unsigned long Pend = &end;
unsigned long ende = end;
Pend und ende haben danach den Wert 0.
Das bringt mir natürlich wenig...

Ich guck mal, woran das liegt...

*/edit*
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Antworten