Für mich persönlich sind das beides Features die ich in einer OO-Sprache gerade bei komplexen Vererbungshierarchien gerne benutze.
Also so komplex soll mein Kernel nicht werden und ist er bisher auch nicht.
Das ist aber schon eine recht sportliche Übung.
Der läuft schon seit 2 oder 3 Jahren und war im Endeffekt das gleiche als ob du nen Loader für die Programme für dein OS schreibst (konnte den meisten Code genau dafür wiederverwenden).
Kann der Grub nicht auch so was in der Art?
Selbst wenn, ich kann und will Grub nicht nutzen. Ich habe meine Memorymap dann doch etwas anders als GRUB aufgebaut und nutze keinen Multiboot-Header zumal ich ja das Zusammenlinken eh selbst machen müsste, weil ich ja nach der vorhandenen HW entscheide welches Modul gelinkt wird.
Das Problem was ich da sehe ist das wenn Du das Exceptionhandling (mit Stackunwinding usw.) ändern möchtest das Du dann eventuell schon deutlich weiter vorne im Compiler ansetzen musst und nicht erst beim Linker.
Da habe ich dann nicht genügend Infos gegeben. Um Exceptionhandling zu unterstützen muss ich "nur" den Stackunwinding-Code, den Code für das DWARF-Format und den Exceptionhandling-Code (throw, catch, rethrow) schreiben. Mit dem Linker hat das nichts mehr zu tun.
Nur bin ich bei dem Versuch zu gucken wie das aussieht auf das Problem gestoßen das mir der GCC ganz schön viele unbekannte Sektionen in meine Objektdatei packt (die ich ja auf die RTTI zurückführen konnte).
Sprich wenn du Exceptions nutzen willst, brauchst du halt die entsprechenden Funktionen (die ich wahrscheinlich relativ einfach kopieren könnte) zu deinem Kernel linken und das sollte soweit funktionieren.
Allerdings wollte ich dann doch ein paar Veränderungen vornehmen, z.B. muss panic() aufgerufen werden, wenn eine Exception nirgends aufgefangen wird und da war irgendetwas was die im GCC Code doppelt machen, das brauche ich auch nicht und dann müssten noch malloc() und free() angepasst werden.
Ich hab vor einiger Zeit mitbekommen das im LLVM-Lager über dieses Thema heftig diskutiert wurde und da wohl auch einige neue Wege beschritten wurden aber genau verfolgt hab ich das auch nicht. Vielleicht könntest Du ja mal über einen Compiler-Wechsel nachdenken (falls beim LLVM wirklich bessere Lösungen vorhanden sind) oder muss es unbedingt der gcc sein?
Ich habe erst gestern LLVM/CLang kompiliert, aber CLang war gleich mal um ein vielfaches langsamer als der gcc bei meinem C-Code. Bei C++ Code habe ich es noch nicht probiert, aber von den Exceptions her nutzen sie das selbe.
Ich bin in sofern an GCC gebunden, das ich spezielle Extensions nutze, die im Kernel schon nicht schlecht sind. Allerdings sollte das meiste von CLang unterstützt werden.
CLang bietet sich dank der Fehlermeldung an. Die sind wirklich um Welten besser als beim GCC!