linux内核Makefile和busybox编译
刚开始学习Linux时的一些记录
linux内核配置体验
- 在arch/arm/configs/目录下面找到相似的配置文件,其名称一般为xxx_defconfig
- make xxx_defconfig
- make menuconfig配置你的内核,
- 配置完成后生成 .config文件在TOPDIR,该文件由于是以‘.’开头,故在linux下是 一个隐藏的文件。
生成的配置信息如 CONFIG_XXX,如CONFIG_DM9000,其可能出现的位置如下
- c源代码,条件编译
- Makefile以及子目录的Makefile,形如objs-$(CONFIG_DM9000) += dm9000.o
- include/config/auto.conf,包含于顶层Makefile中。
- include/linux/autoconfig.h,包含于某个C文件的头文件中,
以上的这些信息都来自于.config文件
注:无论在make menuconfig的时候将CONFIG_XXX选中为’m’ or ‘ y’在autoconf.h都定义为1,m和y的差别区别在于子目录下的Makefile
linux Makefile分析
- 顶层Makefile,生成配置文件.config,生成内核
- arch/$(ARCH)/Makefile,架构相关的Makefile
- srcript/Makefile.*和Makefile
a.c b.c
y:表示编译进内核
obj-y += a.o b.o
m:表示编程为模块
obj-m += ab.o
vmlinux:$(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) \
$(kallsyms.o) FORCE
vmlinux-init := $(head-y) $(init-y)
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
vmlinux-all := $(vmlinux-init) $(vmlinux-main)
vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds
head-y在arch/$(ARCH)/Makefile里面定义
head-y := arch/$(ARCH)/kernel/head_$(MMU_TEXT).o \
arch/$(ARCH)/kernel/init_task.o
init-y := init/
init-y := $(patsubst %/,%/build-in.o,$(init-y))
core-y := usr/ kernel/ mm/ fs/ ipc/ security/ crypto/ block/
core-y := $(patsubst,%/,%/build-in.o,$(core-y))
lib-y := lib
lib-y := lib/lib.a lib/build-in.o
driver-y := driver/ sound/
net-y := net/build-in.o
BusyBox编译安装体验
配置
- make menuconfig
- Busybox Setting->Build Option->选择编译为动态链接还是静态链接
- Install Option->选中Don’t use/usr
- Busybox install prefix(xxx/rootfs)
- make就会在xxx/rootfs生成
注:在编译的过程中可能出现的错误,
- 编译工具有没有库,b,将出错的地方利用menuconfig不进行编译
制作基本文件系统
- mkdir rootfs
- cd rootfs;mkdir bin sbin dev etc usr mnt var sys and so on.
- mknod –m 600 console c 5 1
mknod –m 600 null c 1 3
4, 安装rootfs/etc文件
5, 编译内核模块,在内核源文件目录make modules ARCH=XXX CROSS_COMPILE=XXX-XXX-
安装内核模块,
make modules_install ARCH=XXX INSTALL_MOD_PATH=rootfs/lib/modules