gpt4 book ai didi

linux - 具有多个文件的内核模块 - 未知符号

转载 作者:行者123 更新时间:2023-12-03 02:36:23 25 4
gpt4 key购买 nike

你好,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")

其他 c 文件,它调用位于“主”模块中的 do_module_func()

//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 输出:

无法插入“mymodule.ko”:模块中未知符号,或未知参数

dmesg:

mymodule:未知符号 do_mdule_func (err 0)

因此,模块编译时会出现(链接?)警告,并且模块不会加载。

现在,我看到在 make 输出中,在编译 other_file.c 后似乎存在链接尝试,但在链接之前不应该编译 mymodule.c 吗?

谢谢! :)

最佳答案

事实证明问题出在 Makefile 中。 “技巧”是您在 obj-m 中定义将被编译(到 .ko 中)的模块,并在 -objs 中编写所有源文件。
因此,此 Makefile 中的定义变为:

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

这被编译到 moduleko.ko 中。

关于linux - 具有多个文件的内核模块 - 未知符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16701658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com