创建文件夹
mkdir 03_temp
mkdir 03_temp/a
mkdir 03_temp/b
在 a 文件夹下创建 a.c 与 Makefile
a.c
#include<linux/init.h>
#include<linux/module.h>
int add(int a, int b)
{
printk(KERN_ALERT "EXPORT_SYMBOL !!!\n");
return a+b;
}
EXPORT_SYMBOL(add);
static int a_init(void)
{
printk(KERN_ALERT "a init !!!\n");
return 0;
}
static void a_exit(void)
{
printk(KERN_ALERT "a exit\n");
}
module_init(a_init);
module_exit(a_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ZZA");
MODULE_VERSION("V1.0");
Makefile
obj-m += a.o
KDIR := /home/zza/mount/orangepi-build/kernel/orange-pi-5.16-sunxi64
PWD ?= $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
@echo "---------------编译完成---------------"
rm -f -r outobj/ ../outobj/
mkdir ../outobj/
mv *.ko *.symvers ../outobj/
@echo "---------------开始清理工程---------------"
make -C $(KDIR) M=$(PWD) modules clean
mv ../outobj/ .
@echo "---------------文件输出完成---------------"
clean:
make -C $(KDIR) M=$(PWD) modules clean
rm -f -r outobj/
在 b 文件夹下创建 a.c 与 Makefile
b.c
#include<linux/init.h>
#include<linux/module.h>
extern int add(int a, int b);
static int b_init(void)
{
printk(KERN_ALERT "b init---add is %d !!!\n", add(1, 2));
return 0;
}
static void b_exit(void)
{
printk(KERN_ALERT "b exit\n");
}
module_init(b_init);
module_exit(b_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ZZA");
MODULE_VERSION("V1.0");
Makefile
obj-m += b.o
#修改为具体路径
KBUILD_EXTRA_SYMBOLS = /home/zza/mount/code/03_temp/a/outobj/Module.symvers
KDIR := /home/zza/mount/orangepi-build/kernel/orange-pi-5.16-sunxi64
PWD ?= $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
@echo "---------------编译完成---------------"
rm -f -r outobj/ ../outobj/
mkdir ../outobj/
mv *.ko *.symvers ../outobj/
@echo "---------------开始清理工程---------------"
make -C $(KDIR) M=$(PWD) modules clean
mv ../outobj/ .
@echo "---------------文件输出完成---------------"
clean:
make -C $(KDIR) M=$(PWD) modules clean
rm -f -r outobj/
注意
在 b 文件夹里的makefile,将 KBUILD_EXTRA_SYMBOLS 指定为 a 文件夹中生成的 Module.symvers 的路径
KBUILD_EXTRA_SYMBOLS = /home/zza/mount/code/03_temp/a/outobj/Module.symvers
编译
先编译 a,在编译b
上传测试
将a和b文件夹里的outobj文件夹下的 a.ko b.ko上传到开发板