以下は、組み込みシステムに使用しているコードの断片です。私はgcc
に-ffunction-sections
と-fdata-sections
オプションを渡す:カスタムセクション属性を使用するときにシンボル名を追加する
#define FAST_DATA __attribute__((section(".fast.data")))
int a1 = 1;
int a2 = 1;
FAST_DATA int a3 = 1;
FAST_DATA int a4 = 1;
リンカは、(マップファイル)以下のようにこれらのシンボルを割り当てます。
.data.a1 0x20000020 0x4 ./main.o
0x20000020 a1
.data.a2 0x20000024 0x4 ./main.o
0x20000024 a2
.fast.data 0x10000010 0x8 ./main.o
0x10000010 a4
0x10000014 a3
例えば、私は変数a2
を使用しない場合は、リンカーはそれを破棄します(私は--gc-sections
からld
まで渡します)。 しかし、a3
を使用し、a4
を使用しない場合、a4
は破棄されません。私はそれがa3
と同じセクションに置かれているからだと思います。
私は別の.cファイルにa3
とa4
を定義した場合、それらは同じ名前.fast.data
で、2つの異なるセクションに置くが、各ファイルのされます。ガベージコレクタは期待どおりに動作します。
__attribute__((section("...")))
を使用する場合でも、gcc
にシンボル名を追加するように指示する方法はありますか。 a4
の場合、私の場合は.fast.data.a4
になります。 リンカスクリプトでは、私はすべて*(.fast.data*)
をキャッチします。
私はカスタムセクションを使用して大きなコードベースを持っており、各宣言に対する多くの手作業の変更は望ましくありません。
これは機能しません。 ##は文字列リテラルの中で解釈されません。 – zwol
あなたは正しいです。私はそれを脂肪指す! – Seth