新版本ubuntu19.04中编译驱动make出现警告且加载驱动失败(在ubuntu18.04编译成功也加载成功)

内核编译和嵌入式产品的设计与开发
回复
小颜彦
帖子: 2
注册时间: 2019-11-25 19:58
系统: ubuntu19.04
送出感谢: 0
接收感谢: 0

新版本ubuntu19.04中编译驱动make出现警告且加载驱动失败(在ubuntu18.04编译成功也加载成功)

#1

帖子 小颜彦 » 2019-11-25 20:55

问题描述:
在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
----------------------------------------------------
头像
astolia
论坛版主
帖子: 4178
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 697 次

Re: 新版本ubuntu19.04中编译驱动make出现警告且加载驱动失败(在ubuntu18.04编译成功也加载成功)

#2

帖子 astolia » 2019-11-27 11:41

感觉像是新版kbuild编译机制修正了xxx-objs的用法。现在标准的内核模块依赖的语法是xxx-y,xxx-objs是供可执行程序用的。你换drv-y试试
小颜彦
帖子: 2
注册时间: 2019-11-25 19:58
系统: ubuntu19.04
送出感谢: 0
接收感谢: 0

Re: 新版本ubuntu19.04中编译驱动make出现警告且加载驱动失败(在ubuntu18.04编译成功也加载成功)

#3

帖子 小颜彦 » 2019-11-27 14:22

你好,你的意思是把drv-objs := driver.o lib/libtest.a改成drv-y := driver.o lib/libtest.a 试一下?
试了,还是相同的问题。出现WARNING: "test" [/home/huhao/test_ko/drv.ko] undefined!
回复

回到 “内核及嵌入式开发”