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.
InformationsquelleAutor Neil | 2009-06-15
Schreibe einen Kommentar