Linux内核Makefile文件.docx
《Linux内核Makefile文件.docx》由会员分享,可在线阅读,更多相关《Linux内核Makefile文件.docx(28页珍藏版)》请在咨信网上搜索。
1、Linux 内核 Makefile 文件目录1概述22角色分工33内核编译文件43.1 目标定义43.2 内嵌对象-obj-y43.3 可力口载模块 -obj-m53.4 导出符号目标63.5 库文件-lib-y63.6 目录递归63.7 编译标记73.9 依赖关系83.10 特殊规那么$(obj)83.11 $(CC)支持功能94辅助程序114.1 简单辅助程序114.2 组合辅助程序114.3 定义共享库114.4 C+语言使用方法124.5 辅助程序编译控制选项124.6 何时建立辅助程序134.7 使用 hostprogs-$(CONFIG_FOO)145编译清除机制156体系Make
2、file文件171.1 变量设置171.2 增加预设置项191.3 目录表191.4 引导映像201.5 编译非内核目标211.6 编译引导映像命令211.7 定制编译命令231.8 预处理连接脚本23Kbuild 变量257 Makefile 语言26Credits268 TODO26Example:CFLAGS += $(cc-option-align)-functions=4在上面例子 中对于gcc = 3.00来 说-falign-functions=4, gcc vminor,均为两位数字。例如gcc 3.41将返回0341。当一个特定 $(CC)版本在某个方面有缺陷时cc-vers
3、ion是很有用的。例如-mregparm=3在一些gcc版本会 失败尽管gcc接受这个选项。Example:#arch/i386/MakefileGCC_VERSION := $(call cc-version) cflags-y += $(shell if $(GCC_VERSION) -ge 0300 ; then echo n-mregparm=3n; fi ;)在上面例子中-mregparm=3表示只使用在版本大于等于3.0的gcc中。4辅助程序内核编译系统支持在编译(compliation)阶段编译主机可执行程序。为了使用主机程序 需要两个步骤:第一个步骤使用hostprogs-y变
4、量告诉内核编译系统有主机程序可用。第二 步给主机程序添加潜在的依赖关系。有两种方法,在规那么中增加依赖关系或使用$(always) 变量。具体描述如下。4.1 简单辅助程序在一些情况下需要在主机上编译和运行主机程序。下面这行告诉kbuild在主机上建立 bin2hex 程序。Example:hostprogs-y := bin2hexKbuild假定使用Makefile相同目录下的单一 C代码文件bin2hex.c编译bin2hex。4.2 组合辅助程序主机程序也可以由多个object文件组成。定义组合辅助程序的语法同内核对象的定义 方法。$(-objs)包含了所有的用于链接最终可执行程序的对
5、象。Example:#scripts/lxdialog/Makefile hostprogs-y := Ixdialog Ixdialog-objs := checklist.o Ixdialog.o扩展名.o文件都编译自对应的.c文件。在上面的例子中checklist.c编译成checklist.o,Ixdialog.c编译为Ixdialog.Oo最后两个.0文件链接成可执行文件Ixdialogo注意:语法vexecutable-y不能用于定义主机程序。4.3 定义共享库扩展名为30的对象是共享库文件,并且是位置无关的object文件。内核编译系统提供 共享库使用支持,但使用方法有限制。在下
6、面例子中libkconfig.so库文件被链接到可执行文 件conf中oExample:#scripts/kconfig/Makefile hostprogs-y := conf conf-objs := conf.o libkconfig.so libkconfig-objs := expr.o type.o共享库文件需要对应的-objs定义,在上面例子中库libkconfig由两个对象组成:expr.o 和type.oo expr.o和type.o将被编译为位置无关代码并被链接如libkconfig.so。共享库不支持 C+语言。4.4 C+语言使用方法内核编译系统提供了对C+主机程序的支
7、持以用于内核配置,但不主张其它方面使用 这种方法。Example:#scripts/kconfig/Makefile hostprogs-y := qconf qconf-cxxobjs := qconf.o在上面例子中可执行文件由C+文件qconf.cc组成-通过$(qconf-cxxobjs)标识。如果qconf由.c和.cc文件混合组成,附加行表示这种情况。Example:#scripts/kconfig/Makefile hostprogs-y := qconf qconf-cxxobjs := qconf.o qconf-objs := check.o辅助程序编译控制选项当编译主机程
8、序时仍然可以使用$(HOSTCFLAGS)设置编译选项传递给$(HOSTCC)。 这些选项将影响所有使用变量HOST.EXTRACFLAG的Makefile创立的主机程序。Example:#scripts/lxdialog/MakefileHOST_EXTRACFLAGS +二-I/usr/include/ncurses为单个文件设置选项使用下面方式:Example:#arch/ppc64/boot/MakefileHOSTCFLAGS_piggyback.o := -DKERNELBASE=$(KERNELBASE)也可以使用附加链接选项:Example:#scripts/kconfig/M
9、akefileHOSTLOADLIBES_qconf := -L$(QTDIR)/lib当链接qconf时将使用外部选项”-L$(QTDIR)/lib何时建立辅助程序只有当需要时内核编译系统才会编译主机程序。有两种方式:(1)在特殊规那么中作为隐式的前提需求Example:#drivers/pci/Makefile hostprogs-y := gen-devlist $(obj)/devlist.h: $(src)/pci.ids $(obj)/gen-devlist (cd $(obj); ./gen-devlist) $ $(always) $(extra-yD$(targets)中目标
10、文件都将被删除。代码目录数中的 ”*.oas/、*.ko”文件和一些由编译系统产生的附加文件也将被删除。附加文件可以使用$(clean-files)进行定义。Example:#drivers/pci/Makefileclean-files := devlist.h classlist.h当执行make clean”命令时,devlist.h classlist.h”两个文件将被删除。内核编译系统默认这 些文件与Makefile具有相同的相对路径,否那么需要设置以7开头的绝对路径。删除整个目录使用以下方式:Example:#scripts/package/Makefile clean-dirs
11、:= $(objtree)/debian/这样就将删除包括子目录在内的整个debian目录。如果不使用以7开头的绝对路径内核编译 系统见默认使用相对路径。通常内核编译系统根据”。bj-* := dir/”进入子目录,但是在体系Makefile中需要显式使用如下 方式:Example:#arch/i386/boot/Makefile subdir- := compressed/上面赋值语句指示编译系统执行make clean”命令时进入compressed/目录。在编译最终的引导映像文件的Makefile中有一个可选的目标对象名称是archcleanoExample:#arch/i386/Mak
12、efiIearchclean:$(Q)$(MAKE) $(clean)=arch/i386/boot当执行make clean”时编译器进入arch/i386/boot并象通常一样工作。arch/i386/boot中的 Makefile文件可以使用subdir-标识进入更下层的目录。注意1: arch/$(ARCH)/Makefile不能使用subdir-”,因为它被包含在顶层Makefile文件中, 在这个位置编译机制是不起作用的。注意2:所有列举在core-y libs-y drivers-y和net-y中的目录将被make clean”命令清除。6体系Makefile文件在开始进入各个目
13、录编译之前,顶层Makefile文件设置编译环境和做些准备工作。顶层 Makefile文件包含通用局部,arch/$(ARCH) /Makefile包含该体系架构所需的设置。因此 arch/$(ARCH)/Makefile会设置一些变量和少量的目标。当编译时将按照以下大概步骤执行:1)配置内核= 产生.config文件2)保存内核版本到include/linux/version.h文件中3)符号链接 include/asm to include/asm-$(ARCH)4)更新所有目标对象的其它前提文件- 附加前提文件定义在arch/$(ARCH)/Makefile文件中5)递归进入init-*
14、 core* drivers-* net-* libs-*中的所有子目录和编译所有的目标对象- 上面变量值都引用到arch/$(ARCH)/Makefile文件。6)链接所有的object文件生成vmlinux文件,vmlinux文件放在代码树根目录下。最开始链接的几个object文件列举在arch/$(ARCH)/Makefile文件的head-y变量中。7)最后体系Makefile文件定义编译后期处理规那么和建立最终的引导映像bootimageo包括创立引导记录- 准备initrd映像和相关处理.1变量设置LDFLAGS $(LD)一般选项选项使用于链接器的所有调用中。通常定义emulat
15、ion就可以了。Example:#arch/s390/M akefil eLDFLAGS :=-m elLs390注意:EXTRA_LDFLAGS和LDFLAGS_$可以进一步订制使用选项,请参考第7章。LDFLAGS.MODULE$(LD)链接模块的选项LDFLAGS_MODULE通常设置$(口)链接模块的.ko选项。默认为“-r”即可重定位输出 文件。LDFLAGS_vmlinux $(LD)链接 vmlinux 选项LDFLAGS.vmlinux是定义链接最终vmlinux时链接器的选项。LDFLAGS_vmlinux支 持使用 LDFLAGS_$oExample:#arch/i386/
16、MakefileLDFLAGS_vmlinux :二-e stextOBJCOPYFLAGS objcopy 选项当使用$(call if_changed,objcopy)转化a .。文件时,OBJCOPYFLAGS中的选项将被使 用。$(call if_changed,objcopy)经常被用作为vmlinux产生原始的二进制文件。Example:#arch/s390/MakefileOBJCOPYFLAGS := -O binary#arch/s390/boot/Makefile $(obj)/image: vmlinux FORCE $(call if_changed,objcopy)在
17、上面例子中$(obj)/image是vmlinux的二进制版本文件。$(call if_changed,xxx)的使用 方法见后。AFLAGS$(AS)汇编选项默认值见顶层Makefile文件。针对每个体系需要另外添加和修改它。Example:#arch/sparc64/MakefileAFLAGS += -m64 -mcpu=ultrasparcCFLAGS$(CC)编译器选项默认值见顶层Makefile文件。针对每个体系需要另外添加和修改它。通常CFLAGS变量值取决于内核配置。Example:#arch/i386/M akefil ecflags-$(CONFIG_M386) += -m
18、arch=i386CFLAGS += $(cflags-y)许多体系Makefiles文件动态启动市场目标机器上的C编译器检测支持的选项:#arch/i386/Makefile cflags-$(CONFIG_MPENTIUMIT) += $(call cc-option,-march=pentium2,-march=i686).# Disable unit-at-a-time mode .CFLAGS += $(call cc-option,-fno-unit-at-a-time)第一个例子当config选项是V时将被选中。CFLAGS_KERNEL$(CC)编译 built-in 对象的选
19、项$(CFLAGS_KERNEL)包含外部C编译器选项编译本地内核代码。CFLAGS_MODULE $(CC)编译模块选项$(CFLAGS_MODULE)包含外部C编译器选项编译可加载内核代码。6.2 增加预设置项pr叩are:这个规那么用于列举开始进入子目录编译前需要的前提文件。通常是些包含汇 编常量的头文件。prepare:这个规那么用于列举开始进入子目录编译前需要的前提文件。通常是些包含汇 编常量的头文件。Example:#arch/s390/Makefileprepare: include/asm-$(ARCH)/offsets.h在这个例子中include/asm-$(ARCH)/o
20、ffsets.h将在进入子目录前编译。详见XXX-TODO 文件描述了 kbuild如何产生offset头文件。6.3 目录表体系Makefile文件和顶层Makefile文件共同定义了如何建立vmlinux文件的变量。注 意没有体系相关的模块对象定义局部:所有的模块对象都是体系无关的。head-y, init-y, core-y, libs-y, drivers-y, net-y1概述Makefile包括五局部:Makefile .config arch/$(ARCH)/Makefile scripts/Makefile. * kbuild Makefiles1概述Makefile包括五局部
21、:Makefile .config arch/$(ARCH)/Makefile scripts/Makefile. * kbuild Makefiles顶层Makefile文件内核配置文件机器体系Makefile文件所有内核Makefiles共用规那么 其它Makefile文件通过内核配置操作产生.config文件,顶层Makefile文件读取该文件的配置。顶层 Make行le文件负责产生两个主要的程序:vmlinux (内核image)和模块。顶层Makefile文件根 据内核配置,通过递归编译内核代码树子目录建立这两个文件。顶层Makefile文件文本一 个名为arch/$(ARCH)/M
22、akefile的机器体系Makefile文件。机器体系Makefile文件为顶层 Makefile文件提供与机器相关的信息。每一个子目录有一个Makefile文件,子目录Makefile文件根据上级目录Makefile文件 命令启动编译。这些Makefile使用.config文件配置数据构建各种文件列表,并使用这些文 件列表编译内嵌或模块目标文件。scripts/Makefile.*包含了所有的定义和规那么,与Makefile文件一起编译出内核程序。$(head-y)列举首先链接到vmlinux的对象文件。$(libs-y)列举了能够找到lib.a文件的目录。其余的变量列举了能够找到内嵌对象文
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 内核 Makefile 文件
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。