Linux Kernel Makefiles介绍

本文介绍Linux内核Makefiles的一些基础内容。

一、概述

Makefiles包括:

文件 功能描述
Makefile Linux内核顶层Makefile文件
.config Linux内核配置文件
arch/$(ARCH)/Makefile Linux内核体系结构相关的Makefile文件
scripts/Makefile.* Linux内核kbuild Makefile的通用规则
kbuild Makefiles Linux内核各级目录下的kbuild Makefile文件

Linux内核顶层的Makefile文件递归访问内核源代码的子目录。

每个子目录都有一个kbuild Makefile文件,根据.config文件内容构建内置或模块化目标。

arch/$(ARCH)/Makefile文件向顶层Makefile提供特指定的体系结构信息。

scripts/Makefile.*文件定义了kbuild Makefile构建内核的所有定义和规则等。

Linux内核编译完成后,最终生成vmlinuxmodules

Linux内核中的大多数Makefile都使用kbuild基础结构,kbuild文件的首选名称是Makefile。如果Makefilekbuild文件都存在,则使用kbuild文件。

二、目标定义

目标定义是kbuild Makefile里的核心部分,定义了要构建的文件、特殊的编译选项和递归输入的任何子目录。

例:

## 1、该目录下build_test.c或.s文件将被编译成build_test.o的目标文件
obj-y   += build_test.o

## 2、编译成内核模块
obj-m += module_test.o

## 3、若在defconfig文件中配置CONFIG_TESTR为y,将被直接编译;配置为m,将被编译成内核模块;如果没配置或配置为is not set,则不编译
obj-$(CONFIG_TEST)  += test.o 

## 4、内核模块包括多个文件
obj-$(CONFIG_MODULE_TEST) += module_test.o                    ## CONFIG_MODULE_TEST配置为m,定义module_test为module_name
module_test-y := module_test1.o module_test2.o module_test3.o ## $(<module_name>-y)的格式

## 5、如果配置CONFIG_DIR_TEST为y或m,则进入dir_test目录进行编译;否则不编译
obj-$(CONFIG_DIR_TEST) += dir_test/

## 6、生成lib.a,lib-y通常仅用于lib/和arch/*/lib/目录下
lib-y := test_lib.o

## 7、目录编译使用libs-y
libs-y := test_dir/

 

扫描二维码关注公众号,回复: 14126190 查看本文章

kbuild Makefile将编译所有$(obj-y)文件,然后调用$(AR)rcSTP将这些文件合并到built-in.a文件中。

built-in.a中不包括符号表,稍后将通过scripts/link-vmlinux.sh脚本链接到vmlinux文件中。

Linux内核引导期间,将按照链接顺序调用某些函数(例:module_init()等)。

 

参考:

Documentation/kbuild/makefiles.txt

{{o.name}}
{{m.name}}

猜你喜欢

转载自my.oschina.net/u/4702401/blog/5131289
今日推荐