2009-03-19 21 views
1

私は、同じセクションにいくつかのコードと関連するデータを載せたい、Linuxカーネルモジュールを作成しています。私は特定のセクション名を指定して関数を宣言していない場合はLinuxカーネルモジュールの同じセクションにコードとデータを書き込む

error: foo causes a section type conflict 

:私は次のように、属性タグでデータや関数を宣言:私はこれを行うとき

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

しかし、gccがで文句を言います、gccはそれで問題ありません。しかし、私は関数と変数の両方が同じセクション内にあることを望みます。

gccでこれを行う方法はありますか?私のgccのバージョンは、GCCのマニュアルからgcc (Ubuntu 4.3.2-1ubuntu12) 4.3.2

答えて

1

です:セクション属性は、すべてのプラットフォームでは使用できませんので

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

IIRCは、Linuxはフラットなメモリモデルを使用していますので、あなたは、単一のセクションに「強制的」なものから何も得ていない、とにかく、あなたは何?

Hmmm。私はスペースを確保するためにasm関数を作って、そのアドレスを得るためにポインタfooを行うことができると思います。マクロで醜いものを包みたいかもしれません...

別の考えは、問題を半分に分割することです。できるだけコンパイルし、コンパイルして、asmコードを取得し、それを使って、下流の段階を過ぎていくことができるかどうかを確認してください。それ以外のものがあれば、そのモジュールのasmコードを混乱させるようなものを書くことができます。

もう1つの考え方:小さなasmモジュール(e、g、dbのように、または正しいセクション宣言を持つもの)に変数定義を入れて、リンカーにそれを処理させてみてください。

+0

ありがとうございます!そうです、私はマニュアルでそれを見ました。私はモジュール全体を別々のセクションに入れたいだけでなく、いくつかの関数とグローバル変数を入れたいと思っています。これはいくつかの実験的な作業のためのものであり、我々はその下にあるページテーブルに対して何かをしているので、このレイアウトが必要です。 – samgrover

+0

セクション属性は、Linux(2.6、x86)で確実に利用できます。 –

0

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

+0

したがって、データがconstの場合、OPが実行しようとしているものが機能する可能性があります。あなたはその結論に同意しますか? – ephemient

+0

サイコロ、同じエラーがありません - 私は "const char foo __attribute__((SEC_A")セクション)= 'x'; "を試しました。 –

+0

constは、不変性を意味するものではありません。 – sigjuice

関連する問題