Lowlevel
Lowlevel => OS-Design => Thema gestartet von: Another Stupid Coder am 01. May 2004, 15:22
-
Hallo!
Ich habe ein Kleines Problem. Und zwar habe ich versucht einen kleinen Objektorentierten Kernel nach TeeJay's Tutorial zu basteln und bin drauf gekommen das es nur mit g++, nicht aber mit gcc funktioniert. (zumindest bei mir) Soweit funktioniert das ganze auch. Erst bei Linker (ld) scheitert das ganze mit folgender Fehlermeldung:
Kernel/temp/ckernel.obj(.text+0x3d): In function `__static_initialization_and_destruction_0(int, int)':
: undefined reference to `__dso_handle'
Kernel/temp/ckernel.obj(.text+0x49): In function `__static_initialization_and_destruction_0(int, int)':
: undefined reference to `__cxa_atexit'
make: *** [all] Fehler 1
Tja, sieht so aus als w?rde das an der standard-libary liegen oder? (wegen dem atexit) Meine Commands sehen folgenderma?en aus:
g++ -nostdlib -nostdinc -fno-builtin -fno-rtti -fno-exceptions -c -Os -o Kernel/temp/ckernel.obj Kernel/C/kernel.c
g++ -nostdlib -nostdinc -fno-builtin -fno-rtti -fno-exceptions -c -Os -o Kernel/temp/video.obj Kernel/C/video.cpp
ld -T Kernel/link.ld -o Kernel/temp/c32kernel.bin
Mein Linker-Script:
OUTPUT_FORMAT("binary")
INPUT(Kernel/temp/kernel32.obj Kernel/temp/ckernel.obj Kernel/temp/video.obj)
ENTRY(start)
SECTIONS
{
.text 0x200 : {
code = .; _code = .; __code = .;
*(.text)
. = ALIGN(1);
}
.data : {
data = .; _data = .; __data = .;
*(.data)
. = ALIGN(1);
}
.bss :
{
bss = .; _bss = .; __bss = .;
*(.bss)
. = ALIGN(1);
}
end = .; _end = .; __end = .;
}
Ich denke Code ist un?tig oder? Wenn doch nicht kann ich ihn auch noch posten ich will nur nicht das ganze Forum zuspammen.
W?re nett wenn mir jemand helfen k?nnte.
-
Also soweit ich mich erinnern kann ist bei meinem C++ Tut auch ein Linkerscript dabei, welches aber ein wenig anders aussieht.
Dort werden nämlich die Konstruktoren und Destruktoren aufgerufen.
Und das fehlt bei deinem Linkerscript.
-
Aha, Danke!
-
Ich habe jetzt dein Linker-Script verwendet aber es geht immer noch nicht. Gleiche Fehlermeldung. An was könnte das noch liegen?
-
hmmm ka.
Wie schon im Tut beschrieben hatte ich aus Zeitgründen keine Möglichkeit den Code zu testen.
Du kannst hier mal auf der Seite des Originaltextes schauen:
http://www.invalidsoftware.net/os/?the_id=11
-
Benutzt Du denn globale Instanzen von Klassen?
Vielleicht, dass ein Startup-Code fehlt.
Mit gcc und den richtigen Argumenten müsste es glaub ich auch gehen, weil g++ auch nur gcc mit vordefinierten Argumenten ist oder so. man g++ liefert bei mir auf jeden Fall die gcc-manpages.
-
Ja hatte ich ganz vergessen zu fragen. Hast du überhaupt die Funktion _main und _atexit eingebaut?
-
Ich bin jetzt draufgekommen, dass das ganze nicht am Code liegt, denn mitlerweile habe ich das behoben so das es zwar ganz normal compilliert aber immer wenn ich den Video-Treiber in einer seperaten *.obj-Datei mitzulinken versuche scheint dieser nicht mehr zu funktionieren (es kommt beim Booten kein Text mehr.) Aber wenn ich das ganze in einer einzigen Datei-Compilliere und Linke funzt es. Ich verwende dabei TeeJays Modell das heißt das mit dem kernel16.bin und so...