Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: fNek am 27. November 2012, 20:03
-
Ich erhalte bei meinem C++-Kernel vom Linker Fehlermeldungen, weil die Hauptfunktion und die Konstruktorenfunktion (wie im C++-Tutorial) nicht gefunden werden. Es ist nicht dieser Fehler mit dem extern "C" (das habe ich schon mindestens 100 mal überprüft). Es ist auch kein Tippfehler. Was kann es sonst sein?
Sources auf Anfrage
-
Wie lautet die genaue Fehlermeldung?
-
Fehlermeldung:
ld -Tkernel.ld -o bin/kernel obj/start.o obj/main.o
obj/start.o: In function `_start':
(.text+0x9): undefined reference to `init_ctors'
obj/start.o: In function `_start':
(.text+0xf): undefined reference to `kmain'
make: *** [bin/kernel] Fehler 1
Kein Tippfehler, nicht extern "C" vergessen...
Ich weiß nicht, woran es liegen könnte
-
an der main.o,
die wird mit libc funktionen aufbereiten.
ctor = C++ constructor's
wenn Du C und C++ code verwendest
-
Ich habe alles so gemacht, wie im Tutorial (C++-Kernel); init_ctors ist eine Funktion von mir, kmain ist die Kernel-MAIN Funktion.
init_ctor ist die Funktion, die im Tutorial "C++-Kernel mit GRUB" als initializeConstructors aufgelistet wird. Weil ich mir gedacht habe, dass das früher oder später Tippfehler ergibt, habe ich sie umbenannt in init_ctors. (Tippfehler gab es schon - ein Mal hbe ich z.B. als initialiseConstructors auf die Funktion verwiesen...)
Mein Startup-Code
/*
* Copyright (C) 2012 Martin Formanek
*
* This file is part of MakeMyOS.
*
* MakeMyOS is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MakeMyOS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MakeMyOS. If not, see <http://www.gnu.org/licenses/>.
*/
.section multiboot
/* contains the multiboot header */
#define MBH_MAGIC 0x1BADB002
#define MBH_FLAGS 0x3
#define MBH_CHECKSUM -(MBH_MAGIC + MBH_FLAGS)
.int MBH_MAGIC
.int MBH_FLAGS
.int MBH_CHECKSUM
.section .text
/* contains some preperations */
.global _start
.extern kmain
.extern init_ctors
_start:
cmp %eax, 0x2BADB002
jne _stop
call init_ctors
push %ebx
call kmain
_stop:
cli
hlt
jmp _stop
-
init_ctors und dtors sind halt keine normale user funktionen
die werden verwendet um die "class" aufrufe zu händeln.
die daten werden gesammelt und der linker sollte dann alles zusammen linken
z.b. so:
gcc -o kernel.exe kernel.cc -lc
ich habs auch mal versucht, aber sein lassen.
schau mal im MyOS Thread, da hab ich einen link - wenn der noch geht,
der auf mein Projekt verweist.
Vielleicht hilft Dir das erstmal weiter.
-
lass dir mal die Symbole ausgeben die du in der main.o definiert hast:
$ nm obj/main.o
vielleicht packt dein Compiler ja Underscores davor.
-
Ha! Recht gehabt, MNemo!
Aus irgendeinem Grund wandelt der Compiler die Funktionsnamen um - obwohl ich sie als extern "C" vorausdeklariert habe. Zählt das für den C++-Compiler nicht? Oder hat der Präprozessor die Konstante _cplusplus nicht erkannt?
Mein Lösungsansatz ist jetzt, die Funktionen direkt bei der Definition als extern "C" zu bezeichnen. Ich poste gleich, ob es hilft.
-
Offenbar definiert mir der Präprozessor nicht die Konstante _cplusplus, die ich in einem ifdef benutzt habe. Auf den Fehler hätte ich selber kommen können... Tut mir leid. Wie heißt die Konstante, die bei C++ immer definiert ist, wenn nicht _cplusplus?
-
__cplusplus mit zwei Unterstrichen.
-
Danke!