arm-eabi 用にコンパイルされた GCC/G++ を使用して組み込みアプリケーションを開発しています。リソースの制約により、標準の C++ 例外処理を無効にしようとしています。「-fno-exceptions -nostartfiles -ffreestanding」でコードをコンパイルしています。
クラスのグローバル インスタンスが存在し、そのクラスに別のクラスのインスタンスがメンバーとして含まれている場合、多くの例外処理コードがリンクされています。 printf、fopen、fclose、その他の FILE 関数などの stdio のもの。このアプリケーションにはファイルシステムがなく、たとえあったとしても、これらの関数はコード スペースを浪費しすぎます。
ライブラリには例外を使用しない演算子 new (new(nothrow) を除く) がないため、-fno-exceptions を使用しても、G++ は例外を使用する演算子 new にリンクすることを理解しています。new 演算子と delete 演算子の代替を作成しました。これらは、不要な標準ライブラリ関数だけでなく、出力にもリンクされています。
私を困惑させているのは、私がどこにも新しいと呼んでいないということです。グローバル オブジェクトに、このすべてのコードがリンクされている別のオブジェクトが含まれている場合のみです。
例えば:
class UartA {
...
private:
Ringbuffer* rxbuf;
};
class UartB {
...
private:
Ringbuffer rxbuf;
};
UartA のグローバル インスタンスが作成された場合、例外処理、新しい演算子、および標準入出力はリンクされません。これが私の望みです。
UartB のグローバル インスタンスが作成される場合 (ここで、rxbuf はポインターではなくインスタンスです)、不要なコードがリンクされます。
UartA も UartB も、演算子 new、例外、または stdio を使用しません。rxbuf のタイプのみが異なります。
余分なコードのリンクを防ぐ方法を提案できますか? また、これが UartB にリンクされているのに、UartA にリンクされていないのはなぜですか?