Autor Thema: C++ im Kernel (Linker-Error)  (Gelesen 15058 mal)

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« 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.

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #1 am: 01. May 2004, 17:09 »
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.
----------------------
Redakteur bei LowLevel

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 01. May 2004, 18:36 »
Aha, Danke!

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 01. May 2004, 22:04 »
Ich habe jetzt dein Linker-Script verwendet aber es geht immer noch nicht. Gleiche Fehlermeldung. An was könnte das noch liegen?

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #4 am: 01. May 2004, 23:35 »
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
----------------------
Redakteur bei LowLevel

kleiner

  • Beiträge: 131
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 02. May 2004, 01:43 »
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.

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #6 am: 02. May 2004, 12:57 »
Ja hatte ich ganz vergessen zu fragen. Hast du überhaupt die Funktion _main und _atexit eingebaut?
----------------------
Redakteur bei LowLevel

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 04. May 2004, 08:55 »
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...

 

Einloggen