Wie kann ich verhindern, dass g++ aus der Verbindung von unerwünschten exception-handling-code?
Ich bin der Entwicklung eines embedded-Anwendungen mit GCC/G++ kompiliert für arm-eabi. Aufgrund knapper Ressourcen, ich bin versucht, deaktivieren Sie die standard-C++ - exception-handling. Ich bin kompilieren Sie den code mit "-fno-exceptions
-nostartfiles -ffreestanding".
Wenn Sie eine Globale Instanz einer Klasse existiert, und die Klasse enthält eine Instanz der anderen Klasse als Mitglied, dann eine Menge von exception-handling-code verknüpft wird. Dies wäre nicht so schlimm, außer, dass es auch bringen in vielen stdio Zeug, wie bei printf, fopen, fclose und anderen DATEI-Funktionen. Diese Anwendung hat kein Dateisystem, und selbst wenn es Tat, diese Funktionen verschwenden zu viel code Raum.
Ich verstehe, dass auch mit -fno-exceptions, G++ links in eine operator new verwendet, um Ausnahmen, da die Bibliothek nicht über eine nicht-Ausnahme-mit operator new (außer new(nothrow)). Ich erstellte als Ersatz für operator new und delete, und diese sind verbunden, die in die Produktion als auch die unerwünschten standard-library-Funktionen.
Was mich verwirrt ist, dass ich nicht den Aufruf neuer überall. Es ist nur, wenn ein globales Objekt enthält ein anderes Objekt, dass alle dieser code verknüpft ist.
Beispiel:
class UartA {
...
private:
Ringbuffer* rxbuf;
};
class UartB {
...
private:
Ringbuffer rxbuf;
};
Wenn Sie eine Globale Instanz UartA erstellt wird, die die Ausnahmebehandlung, operator new, und stdio Sachen sind nicht verknüpft. Dies ist, was ich will.
Wenn Sie eine Globale Instanz UartB erstellt wird (wo rxbuf ist eine Instanz anstelle von einem Zeiger), die unerwünschten code verknüpft ist.
Weder UartA noch UartB use-operator neue, Ausnahmen oder stdio. Sie unterscheiden sich nur durch die Art der rxbuf.
Können Sie vorschlagen, wie Sie verhindern, dass die Verknüpfung der zusätzlichen code? Auch, warum ist dieser verbunden, die für UartB, aber nicht UartA?
- Klar, der code kompiliert und verknüpft ist mit der gleichen "-fno-exceptions -nostartfiles -ffreestanding" - flags. "-fno-rtti" ist auch mit drin, aber sollte nicht im Zusammenhang mit diesem problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, die nächsten, die Sie bekommen können, wird die Erhebung von und Verknüpfung mit -fno-exceptions und -fno-rtti. Wenn gibt es ein besserer Weg, um loszuwerden, der rest, wäre ich froh zu hören, es selbst.
Soweit loszuwerden, um neue, versuchen -nostdlib.
da Sie im Grunde die Dinge tun, die ein OS-Entwickler tun, um eine standalone c-oder c++ - Umgebung. Sie sollten nur mit einem custom-linker-Skript. Sie müssen nur vorsichtig sein, denn Dinge wie Globale Konstruktoren nicht mehr passieren wird..aber Sie wird auch nichts bekommen, die Sie nicht explizit danach Fragen (und es ist nicht schwer zu schreiben den code zum aufrufen der globalen Konstruktoren). Hier ist die linker-script von meinem OS.
Es wahrscheinlich nicht mehr als du brauchst (richtet Abschnitten auf 4k-Grenzen, hat alle Symbole auf > 3GB mark), ist aber eine gute Ausgangsposition.
Können Sie es verwenden, wie diese:
den "-lc" sollte der link in der libc auch wenn das, was Sie wollen.
Könnten Sie versuchen, trapping die neue, um zu sehen, ob es wirklich genannt wird, sowieso.
Neue können auftreten, implizit unter bestimmten Umständen, wie Kopie-Konstruktion.
Können Sie in der Lage sein, diese zu entfernen, durch das schreiben der code etwas anders.
http://www.linuxtopia.org/online_books/programming_books/thinking_in_c++/Chapter11_013.html