Autor Thema: C++ Kernel mit Grub und kleines Inline ASM Prob.  (Gelesen 4117 mal)

Programm Noob

  • Gast
Gespeichert
« am: 30. November 2009, 21:32 »
Moin

ich habe ein problem mit meinem C++ kernel, den ich mit Grub laden möchte.

LD gibt mir folgendes aus:
.\obj\asmkernel.o: In function `loader':
.\src\asmkernel.asm:(.text+0x14): undefined reference to `initialiseConstructors'
.\src\asmkernel.asm:(.text+0x19): undefined reference to `main'
.\obj\startup.o: In function `__Z22initialiseConstructorsv':
startup.cpp:(.text+0x9): undefined reference to `_start_ctors'
startup.cpp:(.text+0x1d): undefined reference to `_end_ctors'
.\obj\startup.o:(.eh_frame+0x12): undefined reference to `___gxx_personality_v0'
.\obj\video.o:(.eh_frame+0x12): undefined reference to `___gxx_personality_v0'
.\obj\kernel.o: In function `_main':
kernel.cpp:(.text+0x92): undefined reference to `__Unwind_Resume'
.\obj\kernel.o:(.eh_frame+0x13): undefined reference to `___gxx_personality_v0'

ist der aus dem Wikiartikel C++ Kernel mit Grub.

und die Startup.cpp sieht folgendermaßen aus:
typedef void (*constructor)();
 
// Im Linkerskript definiert
extern "C" constructor start_ctors;
extern "C" constructor end_ctors;
 
extern "C" void initializeConstructors();
 
// Ruft die Konstruktoren für globale/statische Objekte auf
void initialiseConstructors()
{
  for (constructor* i = &start_ctors;i != &end_ctors;++i)
    (*i)();
}


Weiß einer von euch wo der fehler liegt?

Programm Noob
« Letzte Änderung: 01. December 2009, 22:51 von Programm Noob »

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 30. November 2009, 21:41 »
Hi,

rufst du den Compiler, so wie im Tutorial angegeben auf?

Du musst außerdem beachten, dass unter Windows die Symbole einen Unterstrich bekommen. Also was im C-Code foo heißt, heißt in Assembler und im Linkerskript _foo.
Dieser Text wird unter jedem Beitrag angezeigt.

Programm Noob

  • Gast
Gespeichert
« Antwort #2 am: 30. November 2009, 22:05 »
@PorkChicken Ja ich rufe den compiler so wie im tut auf, aber ich nutze den von jidder. Ist das Schlimm ???

EDIT:
Habe jetzt ein paar unterstriche verteilt, und habe einige fehler entsorg, doch ein paar sind geblieben:
.sys .\obj\asmkernel.o .\obj\startup.o .\obj\video.o .\obj\kernel.o
.\obj\asmkernel.o: In function `loader':
.\src\asmkernel.asm:(.text+0x14): undefined reference to `_initialiseConstructors'
.\obj\startup.o:(.eh_frame+0x12): undefined reference to `___gxx_personality_v0'
.\obj\video.o:(.eh_frame+0x12): undefined reference to `___gxx_personality_v0'
.\obj\kernel.o: In function `_main':
kernel.cpp:(.text+0x92): undefined reference to `__Unwind_Resume'
.\obj\kernel.o:(.eh_frame+0x13): undefined reference to `___gxx_personality_v0'

Programm Noob
« Letzte Änderung: 30. November 2009, 22:09 von Programm Noob »

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 30. November 2009, 22:18 »
@PorkChicken Ja ich rufe den compiler so wie im tut auf, aber ich nutze den von jidder. Ist das Schlimm ???
Nein, ist nicht schlimm. (Ich bin übrigens der Jidder im IRC/Wiki.) Aber dann passen die Fehlermeldungen nicht zum Code. Der Compiler macht nämlich keine Unterstriche vor die Symbole (außer du sagst es ihm explizit). Vielleicht mal überprüfen ob du den richtigen Compiler verwendest bzw. in der PATH-Variable hast.

In startup.cpp hast du einmal initializeConstructors und einmal initialiseConstructors geschrieben.

Bau außerdem mal alles komplett neu, und zeig mal die kompletten Kommandozeilen her.
Dieser Text wird unter jedem Beitrag angezeigt.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 30. November 2009, 22:44 »
_Unwind_Resume und __gxx_personality_v0 deuten auf das Fehlen von '-fno-exceptions' auch das scheinbar doch Unterstriche voran gestellt werden deutet auf ein Fehlen von '-fno-leading-underscore'

Versuch mal das ganze mit g++ statt gcc zu kompilieren.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Programm Noob

  • Gast
Gespeichert
« Antwort #5 am: 01. December 2009, 13:48 »
Moin

Fehler ist behoben :-)

Der Fehler war nur das ich in Startup.cpp einmal initializeConstructors
und einmal initialiseConstructors geschrieben habe und
das im aufruf -fno-exceptions fehlte.

Danke, das Forum hier ist super
Bisher konnten alle meine probleme gelößt werden und ich hoffe das wird auch in Zukunft so sein.  :wink:

Programm Noob

Programm Noob

  • Gast
Gespeichert
« Antwort #6 am: 01. December 2009, 22:50 »
Ich habe noch ein kleines Problem, dafür möchte ich nur jetzt keinen neuen Thread öffnen, nämlich bekomme ich folgenden Fehler:
error: expected ')' before string constant

Das ist das Stück Code:
__asm
(
        "mov eax, 0x00000000"
x "cpuid" :"=a" (CEAX),"=b" (CEBX), "=c" (CECX) "=d" (CEDX)
);
Die Zeile mit dem x ist die Fehler zeile.
Ich rufe gcc mit folgendem aufruf auf:
i586-elf-gcc -m32 -o .\obj\cpuid.o -c .\src\cpuid.cpp -ffreestanding -Werror -Wall -nostdinc -fleading-underscore -fno-exceptions -fno-use-cxa-atexit -I .\include  -masm=intel
Ich hoffe es weiß jemandworan das liegt.

Program Noob
« Letzte Änderung: 01. December 2009, 23:16 von Programm Noob »

Tobiking

  • Beiträge: 24
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 01. December 2009, 23:29 »
Da fehlt ein Komma hinter: "=c" (CECX)

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 02. December 2009, 19:25 »
wenn du das mit dem Komma gefixt hast, fehlt dir noch ein ";" bzw. "\n" zwischen den beiden asm-Instruktionen
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Programm Noob

  • Gast
Gespeichert
« Antwort #9 am: 02. December 2009, 22:44 »
Vielen Dank alle Fehler sind behoben.

Programm Noob

X-Mind

  • Gast
Gespeichert
« Antwort #10 am: 30. December 2009, 16:01 »
Zitat
Versuch mal das ganze mit g++ statt gcc zu kompilieren.

Ich meine mich zu erinnern, das g++ ein shell-skript ist,
das den gcc mit ein paar flags aufruft.

 

Einloggen