驱动模块(4)——模块编译-Makefile编写

1.Kernel中的Makefile将多个文件编译成一个模块

复制代码
Example1: drivers/usb/core/Makefile:
usbcore-y := usb.o hub.o hcd.o urb.o message.o driver.o usbcore-y += config.o file.o buffer.o sysfs.o endpoint.o usbcore-y += devio.o notify.o generic.o quirks.o devices.o usbcore-y += port.o usbcore-$(CONFIG_OF) += of.o usbcore-$(CONFIG_USB_PCI) += hcd-pci.o usbcore-$(CONFIG_ACPI) += usb-acpi.o obj-$(CONFIG_USB) += usbcore.o obj-$(CONFIG_USB_LEDS_TRIGGER_USBPORT) += ledtrig-usbport.o
复制代码
Example2:net/rfkill/Makefile
rfkill-y            += core.o
rfkill-$(CONFIG_RFKILL_INPUT)    += input.o
obj-$(CONFIG_RFKILL)        += rfkill.o
obj-$(CONFIG_RFKILL_GPIO)    += rfkill-gpio.o

只有obj-y += xxxx.o 才会被编译成xxxx.ko文件

 

2.使用Yocto内核模块编译方法(多文件)

复制代码
usbcore-y := usb.o hub.o hcd.o urb.o message.o driver.o
usbcore-y += config.o file.o buffer.o sysfs.o endpoint.o
usbcore-y += devio.o notify.o generic.o quirks.o devices.o
usbcore-y += port.o
usbcore-y += of.o

obj-m += usbcore.o

KDIR := /media/ubuntu/work/Yocto3_4/build/tmp/work/g6m-poky-linux/linux-renesas/4.14.35-r1/build/

all:
    make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=aarch64-poky-linux- ARCH=arm64
    rm -f *.o *.order *.mod.c *.symvers *~

clean:
    rm -f *.o *.order *.mod.c *.symvers *~ *.ko

#补充
clean:
    make -C $(KERN_DIR) M=`pwd` modules clean #可实现自动删除
    rm -rf modules.order
复制代码

 

3.将单个驱动文件编译成模块

复制代码
SRC := ehci-hcd
obj-m := $(SRC).o
KDIR := /media/ubuntu/work/Yocto3_4/build/tmp/work/g6m-poky-linux/linux-renesas/4.14.35-r1/build

all:
    #make -C $(KDIR) M=$(PWD) modules  ARCH=arm64(使用时这个删除并且下面给tab键)
    make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=aarch64-poky-linux- ARCH=arm64

clean:
    rm -f *.o *.order *.mod.c *.symvers *~ *.ko
复制代码

 

4.Ubuntu主机模块编译

obj-m += leds_4412.o

all:
    make -C /lib/modules/`uname -r`/build M=$(PWD)
    rm -rf *.o *.o.cmd *.ko.cmd *.order *.symvers *.mod.c .tmp_versions

clean:
    rm -rf *.ko

 

5. Makefile中使用宏选择模块,和使用内核版本选择模块

ifeq ($(CONFIG_FEATURE_SELECT), y)
ifeq ($(VERSION).$(PATCHLEVEL), 5.4)
obj-y += feature_select_v1.o
endif
else
obj-y += feature_select_v2.o
endif

 

6. Makefile中编译elf测试文件

参考 samples/timers 写自己的elf文件,然后在deconfig文件中选中。

复制代码
samples$ tree hello
hello
├── hello_world.c
└── Makefile

samples$ cat hello/Makefile 
# SPDX-License-Identifier: GPL-2.0
userprogs-always-y += hello_world
userccflags += -I usr/include

samples$ cat Makefile 
subdir-$(CONFIG_SAMPLE_HELLO_WORLD)    += hello

samples$ cat Kconfig
config SAMPLE_HELLO_WORLD
    bool "hello world"
    help
      only printf hello world.
复制代码

 

 

 

 

 

参考:
Documentation/kbuild
Documentation/kbuild/modules.txt里面介绍了如何编译成模块。

 

posted on   Hello-World3  阅读(486)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示