2011-12-07 14 views
1

私は、カーネルの_stext_etextのシンボルにアクセスする必要があるカーネルモジュールを持っています。カーネルはこれらのシンボル(/proc/kallsyms)の定義を持っているにもかかわらず、何らかの理由、私は私のモジュールをロードするたびに、私は2.6 Linuxカーネルの_stextと_etext - カーネルモジュールがそれらにリンクできないのはなぜですか?

mymodule: Unknown symbol _etext (err 0) 
mymodule: Unknown symbol _stext (err 0) 

を得るために私は汚染されたカーネルを実行していないよ、とモジュール内の他のすべてがOKをリンクするようです。 _stext_etextへのリンクに関するモジュールまたはライセンスの制限はありますか?カーネルには、コードメモリの先頭と末尾に使用できる代替定義がありますか?

更新:

私はカーネルのソースを見て、そしてkallsyms.cで、これはありますよ。

static int read_symbol_tr(const char *sym, unsigned long long addr) 
{ 
size_t i; 
struct text_range *tr; 

for (i = 0; i < ARRAY_SIZE(text_ranges); ++i) { 
    tr = &text_ranges[i]; 

    if (strcmp(sym, tr->stext) == 0) { 
     tr->start = addr; 
     return 0; 
    } else if (strcmp(sym, tr->etext) == 0) { 
     tr->end = addr; 
     return 0; 
    } 
} 

return 1; 
} 

が、これは私が/proc/kallsymsを見ている_etext_stextエントリがあることを意味していますカーネルモジュールが実際にリンクできない偽のシンボル?

答えて

1

カーネルモジュールリンカは、追加のメカニズムを介して「エクスポートされた」シンボルのみをリンクします。シンボルは、EXPORT_SYMBOL()またはEXPORT_SYMBOL_GPL()でエクスポートする必要があります。 (_GPLの亜種は、カーネル開発者が内部のインターフェイスをラベルしているため、GPLのライセンスを受けたコードでしか利用できないことを示しています)。_stextまたは_etextのいずれかのエクスポートがカーネルソースで見つかりません。使用できるようになりました。

あなたは何を達成しようとしていますか?

+0

ああ - はい - 私はそれほど疑わしいようになりました。私が達成しようとしているものとして、私は2.6.37カーネルを他の誰かがデバイスNANDに組み込んで作業しています。私がやっている作業の中には、oprofileが必要です。 oprofileを構築したり、CONFIG_PROFILINGのようなoprofileの依存関係の多くを含んでいませんでした。 –

+0

...自分のカーネルを設定パラメータでビルドすることはできますが、NANDに取り込むことは問題になります。同様のカーネルをモジュール化されたoprofileで構築することもできますが、カーネルにはoprofileの依存関係が多くなく、依存関係を簡単にモジュール化することはできません。だから私の仕事のために、フランケンシュタイン作成のoprofileモジュールをハッキングしています。 –

+0

うわー、私の哀悼の言葉は、ちょうどプロファイリングデータを取得するための挫折の長い道のりです。がんばろう! – sarnold

関連する問題