2017-10-31 4 views
2

以下は、組み込みシステムに使用しているコードの断片です。私は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ファイルにa3a4を定義した場合、それらは同じ名前.fast.dataで、2つの異なるセクションに置くが、各ファイルのされます。ガベージコレクタは期待どおりに動作します。

__attribute__((section("...")))を使用する場合でも、gccにシンボル名を追加するように指示する方法はありますか。 a4の場合、私の場合は.fast.data.a4になります。 リンカスクリプトでは、私はすべて*(.fast.data*)をキャッチします。

私はカスタムセクションを使用して大きなコードベースを持っており、各宣言に対する多くの手作業の変更は望ましくありません。

答えて

3

誰もがより良いアイデアを持っていない場合は、ここにあなたのためのその場しのぎです:

#define DECLARE_FAST_DATA(type, name) \ 
    __attribute__((section(".fast.data." #name))) type name 

は、用法:

int a1 = 1; 
int a2 = 1; 
DECLARE_FAST_DATA(int, a3) = 1; 
DECLARE_FAST_DATA(int, a4); 

これは "stringification" の標準C機能を使用し、 "string literal concatenation"必要なセクション属性を合成します。

0

マクロの拡張はどうですか?

#define FAST_DATA(_a,_b,_c) \ 
    __attribute__((section(".fast.data." #_b))) _a _b = _c 
+0

これは機能しません。 ##は文字列リテラルの中で解釈されません。 – zwol

+0

あなたは正しいです。私はそれを脂肪指す! – Seth

関連する問題