かずブログ

Orange Tiny Terror
ひたすら弾くだけ! ギター・トレーニング
地獄のメカニカル・トレーニング・フレーズ 暴走するクラシック名曲編
HERCULES GS432B
冒険野郎マクガイバー シーズン1〈日本語完全版〉
冒険野郎マクガイバー シーズン2〈日本語完全版〉
冒険野郎マクガイバー シーズン3〈日本語完全版〉
Destination (通常盤)
circus (DVD付)
SanDisk UltraII メモリースティックPRO Duo 4GB 転送速度15MB/Sec SDMSPDH-004G-J61
SanDisk microSD Memory Kit 2GB SDSDQ-2048-J3K

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 [127] かず

投稿パス:

名前:  題名:


パスワード: 

Next >> [いま、会いにゆきます]
Back >> [電球の代わりになるLED登場]