4

こんにちはstackoverflowers :)

ここ数時間、私は複数のファイル モジュールをコンパイルしてロードしようと試みてきました。コンパイルで奇妙な警告が表示され、モジュールのロードに失敗します。モジュール、Makefile、コンパイル出力、dmesg は次のとおりです。

ヘッダ:

// header.h

#ifndef _HEADER_H
#define _HEADER_H
void do_module_func(void);
void do_other_func(void);
#endif

「メイン」モジュール ファイル:

//mymodule.c

#include <linux/module.h>
#include <linux/kernel.h>
#include "header.h"

void do_module_func(void)
{
    printk(KERN_INFO "module_func\n");
}

static int mymodule_init(void)
{
    printk(KERN_INFO "Hello world\n");
    do_other_func();
    return 0;
}
module_init(mymodule_init);


static void mymodule_exit(void)
{
    printk(KERN_INFO "Goodbye, cruel world\n");
}
module_exit(mymodule_exit);

MODULE_LICENSE("GPL")

do_module_func()「メイン」モジュールにある呼び出しを行う他の c ファイル

//other_file.c

#include "header.h"
#include <linux/kernel.h>

void do_other_func(void)
{
    printk(KERN_INFO "other_func\n");
    do_module_func();
}

メイクファイル

//Makefile

obj-m := mymodule.o
mymodule-objs := other_file.o

CROSS:=arm-unknown-linux-gnueabi-
KERNEL:= ~/work/linux-davinci-2.6.38/
ARCH:=arm

PWD:=$(shell pwd)

all:
    $(MAKE) CROSS_COMPILE=$(CROSS) ARCH=$(ARCH) -C $(KERNEL) M=$(PWD) modules

clean:
    $(MAKE) CROSS_COMPILE=$(CROSS) ARCH=$(ARCH) -C $(KERNEL) M=$(PWD) clean

私はクロスコンパイルを行っていますが、これは問題ではないと考えています。出力を行います:

make CROSS_COMPILE....
make[1]: Entering directory .../linux-davinci-2.6.38
  CC [M] .../other_file.o
  LD [M] .../mymodule.o
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: "do_module_func" [.../mymodule.o] undefined! <--- warning here
  CC .../mymodule.mod.o
  LD [M] .../mymodule.ko
make[1]: Leaving directory .../linux-davinci-2.6.38

insmod 出力:

can't insert 'mymodule.ko': unknown symbol in module, or unknown parameter

dmesg:

mymodule: Unknown symbol do_mdule_func (err 0)

したがって、モジュールは (リンケージ?) 警告でコンパイルされ、モジュールはロードされません。

make の出力を見ると、other_file.c をコンパイルした後にリンケージが試行されているように見えますが、リンケージの前に mymodule.c もコンパイルするべきではありませんか?

ありがとう!:)

4

3 に答える 3

10

問題は Makefile にあることがわかりました。「トリック」は、obj-m(.ko に) コンパイルされるモジュールで定義し、-objsすべてのソース ファイルを記述することです。
したがって、この Makefile の定義は次のようになります。

obj-m := moduleko.o
moduleko-objs := other_file.o mymodule.o

これはmoduleko.koにコンパイルされます。

于 2013-05-23T12:17:45.047 に答える
0

これは、file_2 が LKM として file_2 をビルドするために file_1 シンボル参照を必要としたためです。これを克服するには、file_1(LKM) をビルドし、file_1 の Module.symvers を file_2 の場所に配置します。file_2 を再度ビルドします。

于 2014-04-10T09:30:51.537 に答える
-1
all:
    $(MAKE) CROSS_COMPILE=$(CROSS) ARCH=$(ARCH) -C $(KERNEL) M=$(PWD) modules
instead try like this
     $(MAKE) -C  $(KERNEL) ARCH=$(ARCH)  CROSS_COMPILE=$(CROSS) M=$(PWD) /
          this will run each file and links with object.hope this would solve your problem
于 2014-05-12T14:05:05.437 に答える