セクションが c コードで次のように定義されている ghs コンパイラでコンパイルされたコードがあります。
#pragma ghs section data = ".shareddata"
// some c code
#pragma ghs section data = default
上記のことのために gcc を使用してセクションのプラグマを定義するにはどうすればよいですか
一般に、gcc はプラグマの使用を推奨せず、代わりに関数と変数の両方に属性を使用することを提案します。
GCC マニュアル (「関数の属性の宣言」) から:
通常、コンパイラは、生成したコードをテキスト セクションに配置します。ただし、追加のセクションが必要な場合や、特定の機能を特別なセクションに表示する必要がある場合があります。section 属性は、関数が特定のセクションに存在することを指定します。たとえば、宣言は次のとおりです。
extern void foobar (void) __attribute__ ((section ("bar")));
関数 foobar を bar セクションに配置します。
「変数の属性指定」より
通常、コンパイラは生成したオブジェクトを data や bss などのセクションに配置します。ただし、追加のセクションが必要な場合や、特別なハードウェアにマップする場合など、特定の変数を特別なセクションに表示する必要がある場合があります。section 属性は、変数 (または関数) が特定のセクションに存在することを指定します。たとえば、次の小さなプログラムでは、いくつかの特定のセクション名を使用しています。
struct duart a __attribute__ ((section ("DUART_A"))) = { 0 };
struct duart b __attribute__ ((section ("DUART_B"))) = { 0 };
char stack[10000] __attribute__ ((section ("STACK"))) = { 0 };
int init_data __attribute__ ((section ("INITDATA")));
main()
{
/* Initialize stack pointer */
init_sp (stack + sizeof (stack));
/* Initialize initialized data */
memcpy (&init_data, &data, &edata - &data);
/* Turn on the serial ports */
init_duart (&a);
init_duart (&b);
}
例に示すように、ローカル変数ではなくグローバル変数で section 属性を使用します。
初期化済みまたは初期化されていないグローバル変数で section 属性を使用できますが、初期化されていない変数が一時的に共通 (または bss) セクションに入り、複数の「定義」が可能であることを除いて、リンカは各オブジェクトを 1 回定義する必要があります。セクション属性を使用すると、変数が入るセクションが変更され、初期化されていない変数に複数の定義がある場合、リンカーがエラーを発行する可能性があります。-fno-common フラグまたは nocommon 属性を使用して、変数を強制的に初期化できます。一部のファイル形式は任意のセクションをサポートしていないため、セクション属性はすべてのプラットフォームで使用できるわけではありません。モジュールの内容全体を特定のセクションにマップする必要がある場合は、代わりにリンカーの機能を使用することを検討してください。