1

同じセクションにコードと関連データを入れたいLinuxカーネルモジュールを書いています。次のように、属性タグを使用してデータと関数を宣言します。

void * foo __attribute__ ((section ("SEC_A"))) = NULL;
void bar(void)  __attribute__ ((section("SEC_A")));

ただし、これを行うと、gcc は次のように文句を言います。

error: foo causes a section type conflict

特定のセクション名で関数を宣言しない場合、gcc は問題ありません。しかし、関数と変数の両方を同じセクションに入れたいです。

gccでそれを行う方法はありますか? 私のgccバージョンはgcc (Ubuntu 4.3.2-1ubuntu12) 4.3.2

4

2 に答える 2

1

GCCマニュアルから:

一部のファイル形式は任意のセクションをサポートしていないため、セクション属性はすべてのプラットフォームで使用できるわけではありません。モジュールの内容全体を特定のセクションにマップする必要がある場合は、代わりにリンカーの機能を使用することを検討してください。

IIRC、Linuxはフラットメモリモデルを使用しているので、とにかく、物事を単一のセクションに「強制」することによって何も得られませんか?

うーん。asm関数を作成してスペースを予約し、ポインターfooを実行してそのアドレスを取得できると思います。醜いものをマクロで包みたいかもしれません...

もう1つの考えは、問題を半分に分割することです。可能な限り最も近いものの小さな例を記述し、それでもコンパイルし、asmコードを取得し、それをいじって、ダウンストリームステージを通過できるものを確認します。他に何もなければ、そのモジュールのasmコードを混ぜ合わせて、makeファイルに埋め込み、それを適切と呼ぶための何かを書くことができます。

さらに別の考え:変数定義を小さなasmモジュール(たとえば、dbとして、または適切なセクション宣言を持つものとして)に入れて、リンカーに処理させてみてください。

于 2009-03-19T19:50:00.530 に答える
0

テキスト (関数) オブジェクトとデータ (BSS) オブジェクトを同じセクションに入れることはできないと思います。これは、(一部の) OS がプロセスの再利用のために .TEXT セクション タイプの不変性を想定しているためです。

于 2009-03-19T20:30:28.420 に答える