Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: fNek am 27. November 2012, 20:03

Titel: Undefined reference to XXX
Beitrag 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
Titel: Re: Undefined reference to XXX
Beitrag von: Jidder am 27. November 2012, 20:12
Wie lautet die genaue Fehlermeldung?
Titel: Re: Undefined reference to XXX
Beitrag von: fNek am 28. November 2012, 17:06
Fehlermeldung:

Zitat von: make
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
Titel: Re: Undefined reference to XXX
Beitrag von: paule22 am 28. November 2012, 17:13
an der main.o,
die wird mit libc funktionen aufbereiten.
ctor = C++ constructor's
wenn Du C und C++ code verwendest
Titel: Re: Undefined reference to XXX
Beitrag von: fNek am 28. November 2012, 17:21
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
Zitat von: start.S
/*
 * 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
Titel: Re: Undefined reference to XXX
Beitrag von: paule22 am 28. November 2012, 18:18
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.
Titel: Re: Undefined reference to XXX
Beitrag von: MNemo am 29. November 2012, 18:18
lass dir mal die Symbole ausgeben die du in der main.o definiert hast:
$ nm obj/main.ovielleicht packt dein Compiler ja Underscores davor.
Titel: Re: Undefined reference to XXX
Beitrag von: fNek am 30. November 2012, 18:55
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.
Titel: Re: Undefined reference to XXX
Beitrag von: fNek am 30. November 2012, 18:58
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?
Titel: Re: Undefined reference to XXX
Beitrag von: Jidder am 30. November 2012, 19:04
__cplusplus mit zwei Unterstrichen.
Titel: Re: Undefined reference to XXX
Beitrag von: fNek am 02. December 2012, 09:18
Danke!