かずブログ
[127] / unresolved symbol

最近、仕事でLinuxを使っているので、ハマったりしたことについて残しておこうと思います。
Linux経験1ヶ月なので、誰でも知っているようなアホな内容も含まれるかもしれません。

早速ですが、DMAコントローラがちゃんと使えるか試すために、既存のDMAドライバを使用し、RAM→RAMとDMA転送するドライバ(モジュール)を作ってみたのですが、insmodしたら「unresolved symbol なんちゃら」という感じのがいくつか出ました。
どうやらモジュールから呼び出している関数が見当たらないとのことです。

dma.cには該当の関数はちゃんと定義されているし、dma.cもコンパイルされてdma.oが作成されているし…。Makefileも間違っていない…。
(DMAドライバは、モジュールではなくカーネル組み込み型です)

散々悩んだところ、dma.cと一緒にコンパイルされて正常にシンボル参照ができるっぽいio.cとの違いを調べてみたら、dma.cはlinux/module.hがincludeされていません。
また、EXPORT_SYMBOLもio.cにはあるのにdma.cにはありませんでした。

これらから推測すると…
ドライバでlinux/module.hをincludeしないと、カーネル組み込み型ドライバからは呼び出せるがモジュールからは呼び出せない。モジュールからも呼び出せるようにするには、linux/module.hをインクルードしなくてはならない。
かなと思いました。

やることは3つ。
1.linux/module.hを参照できないシンボルを定義しているソースにincludeする。
2.参照したいシンボルをEXPORT_SYMBOLでexportする。
3.そのソースのMakefileのexport(詳細忘れました)のところに.o(ここではdma.o)を追加する。

となります。

かず (2006/06/26(Mon) 23:35:26)

投稿パス:

名前:
題名:


パスワード: 

トップへ

(c)FLEUGELz