Os-Dev: Problem beim linken
-
Hallo.
Seit einiger Zeit, so ungefähr einer Woche, probiere ich mich ein wenig an der Programmierung von kleinen hobby Betriebssystemen. Ich habe ein Tutorial das ich durcharbeite. Dieses Tutorial benutz asm und c und ich bin nunmal geneigt cpp zu benutzen. Also mach ich das Tutorial Schritt für Schritt, einmal genau so wie es vorgegeben ist und einmal umgebaut in cpp. Nasm ist der assembler meiner wahl und mingw gcc bzw g++ sind meine compiler, ld mein linker.Jetzt habe ich bei meiner cpp-version das Problem, dass ich von meinem cpp code, welchen ich mit g++ kompiliere, nicht auf in asm und c geschriebene Funktionen zugreifen kann, obwohl es im equivalenten c-code funktioniert. Dieses äussert sich dann bei den vom Linker ausgegebenen Fehlermeldungen.
Falls jemand eine Erklärung für dieses Problem hat und villeicht auch eine Lösungsmöglichkeit möge er/sie diese bitte hier posten.
Danke
-
Wäre nett gewesen die Fehlermeldungen auch mitzuposten. Dann könnte man nämlich auch was anderes machen als zu raten. Einfach mal ein Schuß ins Blaue: extern "C" vergessen?
-
der fehler ist in etwa genau der den ich da beschrieben hab, das die definition zu einem funktionsaufruf nicht gefunden werden kann. Ich hab zzt leider nicht die möglichkeit meinen src einzusehen, hab nur grad ein wenig wartezeit und sitze hier an einem fremden rechner und versuche dieses problemm zu lösen.
das mit extern "c" ist son problem da der compiler das nicht erkennt und das ist ne neue mingw version, ka vielleicht mach ich da was falsch, benutz das nicht sonderlich häufig.
-
es geht wahrscheinlich ums namemangling der C++ funktionen. in c++ kann man die methoden/funktionen ja überladen, damit die dann aber doch eine unterschiedliche signatur haben baut der compiler die parameter sozusagen mit in den namen ein.
mit extern "C" kann man das verhindern, dann werden die funktionen wie c funktionen behandelt und können auch nicht überladen werden.
bsp:
extern "C" {
void super_funktion(int i);
}um die implementierung muss dann glaube ich kein extern "C" mehr, bin mir da jetzt aber nicht ganz sicher.
alternativ kannst du dir auch die namen nach dem mangling ansehen, irgendwas wie objdump auf die obj datei, in der du funktionen aufrufen willst.
viel spaß und zeig mal, wie weit du kommst
halt durch, kann man da nur wünschen.jenz
-
ok, danke erst mal.
hier noch ein paar infos zu dem problem und meinem restlichen aktuellen einstellungen, obwohl das wohl mit dem namemangling zu tun haben wird, kling zumindest einleuchtend.
hier der linker script
OUTPUT_FORMAT("pe-i386") ENTRY(entry) LS_Phys = 0x100000; LS_Virt = 0x100000; SECTIONS { .text LS_Virt : AT(LS_Phys) { LS_Code = .; code = .; _code = .; *(.text) *(.rodata*) . = ALIGN(4096); } .data : AT(LS_Phys + (LS_Data - LS_Code)) { LS_Data = .; data = .; _data = .; *(.data) . = ALIGN(4096); } .bss : AT(LS_Phys + (LS_Bss - LS_Code)) { LS_Bss = .; bss = .; _bss = .; *(.bss) *(COMMON) . = ALIGN(4096); } .stab : { *(.stab) } .stabstr : { *(.stabstr) } end = .; _end = .; }und die genaue fehlermeldung, wenn ich nur die kernel.cpp mit g++ kompiliere und den rest mit standard gcc.
obj\kernel.o(.text+0x19): In function `main': ~path~/src/kernel.cpp:10: undefined reference to `gdt_install()' obj\kernel.o(.text+0x1e): ~path~/src/kernel.cpp:12: undefined reference to `init_video()'
-
das hilft leider nicht viel.
entweder deklarierst du die beiden funktionen mit extern "C" oder du benutzt im assembler aufruf den gemangelten namen.
bis dann,
jenz
-
ja lag auch am extern und meien problem damit lag daran das ich es nicht in #ifdef __cplusplus ... #endif eigechlossen hab und der c compiler das natürlich nicht kennt. naja jetzt funktioniert es.
danke
PS: war übrigens der erste thread von einigen auf dieser seite an denen ich beteiligt war, der nicht voll war mit nichtsbringenden posts die nur den threadsteller beleidigen, wegen dessen unwissenheit. ein großes makel an diesem forum.