问题描述:
在lib中编译生成静态库libtest.a, 然后编译生成驱动drv.ko时使用该静态库,最后insmod加载drv.ko
目前在版本ubuntu18.04及之前的ubuntu版本中可以无警告生成drv.ko,也能成功insmod加载drv.ko
但是在19.04中,编译驱动时就会下面的警告,及加载错误
make信息
rm -f *.o *.ko *.o.cmd *.mod.c *.symvers *.cmd
make -C /lib/modules/5.0.0-13-generic/build M=/home/huhao/test_ko modules
make[1]: Entering directory '/usr/src/linux-headers-5.0.0-13-generic'
CC [M] /home/huhao/test_ko/driver.o
LD [M] /home/huhao/test_ko/drv.o
Building modules, stage 2.
MODPOST 1 modules
WARNING: "test" [/home/huhao/test_ko/drv.ko] undefined! ->出现找不到静态库libtest.a中test函数
CC /home/huhao/test_ko/drv.mod.o
LD [M] /home/huhao/test_ko/drv.ko
make[1]: Leaving directory '/usr/src/linux-headers-5.0.0-13-generic'
上面虽然make之后可以生成drv.ko驱动,但是加载之后会报错:
insmod: ERROR: could not insert module drv.ko: Unknown symbol in module
问题出现在哪呢?哪位大神指点一下,非常感谢!
文件结构如下:
├── lib
│ ├──myalib.c
│ ├──myalib.h
│ └── Makefile
├── Makefile
└── driver.c
文件内容:
【myalib.c】
----------------------------------------------------
#include<stdio.h>
int test(void)
{
return 1 + 2;
}
----------------------------------------------------
【myalib.h】
----------------------------------------------------
int test(void);
----------------------------------------------------
【Makefile】 lib下生成静态库的
----------------------------------------------------
# This is the Makefile for making libtest.a.
RM = rm -f
CCFLAGS = -c
ARFLAG = -rc
CC = gcc
AR = ar
lib_OBJECTS = myalib.o
lib_SOURCE = myalib.c
LIB = libtest.a
libtest.a:$(lib_OBJECTS)
$(AR) $(ARFLAG) -o $@ $^
$(lib_OBJECTS):$(lib_SOURCE)
$(CC) $(CCFLAGS) -o $@ $^
clean:
$(RM) $(lib_OBJECTS)
$(RM) $(LIB)
----------------------------------------------------
【driver.c】
----------------------------------------------------
#include <linux/init.h>
#include <linux/module.h>
#include "./lib/myalib.h"
MODULE_LICENSE("Dual BSD/GPL");
int init_module(void)
{
printk("into init_module.\n");
printk("test add = %d.\n", test());
return 0;
}
void cleanup_module(void)
{
printk("into cleanup_module.\n");
test();
}
----------------------------------------------------
【Makefile】生成驱动drv.ko
----------------------------------------------------
# This is the Makefile for making drv.ko.
obj-m := drv.o
drv-objs := driver.o lib/libtest.a
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
$(OBJDIR)/%.o: $(SRCDIR)/%.c
$(CC) -o $@ $(CFLAGS) -c $<
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.o *.ko *.o.cmd *.mod.c *.symvers *.cmd
----------------------------------------------------
新版本ubuntu19.04中编译驱动make出现警告且加载驱动失败(在ubuntu18.04编译成功也加载成功)
-
- 帖子: 2
- 注册时间: 2019-11-25 19:58
- 系统: ubuntu19.04
- astolia
- 论坛版主
- 帖子: 6455
- 注册时间: 2008-09-18 13:11
Re: 新版本ubuntu19.04中编译驱动make出现警告且加载驱动失败(在ubuntu18.04编译成功也加载成功)
感觉像是新版kbuild编译机制修正了xxx-objs的用法。现在标准的内核模块依赖的语法是xxx-y,xxx-objs是供可执行程序用的。你换drv-y试试
-
- 帖子: 2
- 注册时间: 2019-11-25 19:58
- 系统: ubuntu19.04
Re: 新版本ubuntu19.04中编译驱动make出现警告且加载驱动失败(在ubuntu18.04编译成功也加载成功)
你好,你的意思是把drv-objs := driver.o lib/libtest.a改成drv-y := driver.o lib/libtest.a 试一下?
试了,还是相同的问题。出现WARNING: "test" [/home/huhao/test_ko/drv.ko] undefined!
试了,还是相同的问题。出现WARNING: "test" [/home/huhao/test_ko/drv.ko] undefined!