linux 内核移植(四)——Makefile和链接脚本分析
2016-08-21 21:22
302 查看
1:Makefile分析
(1) kernel的Makefile写法和规则等和uboot的Makefile是一样的,甚至Makefile中的很多内容都是一样的。
(2) kernel的Makefile比uboot的Makefile要复杂,这里我们并不会一行一行的详细分析。
(3) Makefile中只有一些值得关注的我会强调一下,其他不强调的地方暂时可以不管。
(4) Makefile中刚开始定义了kernel的内核版本号。这个版本号挺重要(在模块化驱动安装时会需要用到),要注意会查,会改。
(5) 在make编译内核时,也可以通过命令行给内核makefile传参(跟uboot配置编译时传参一样)。譬如make O=xxx可以指定不在源代码目录下编译,而到另外一个单独文件夹下编译。
(6) kernel的顶层Makefile中定义了2个变量很重要,一个是ARCH,一个是CROSS_COMPILE。ARCH决定当前配置编译的路径,譬如ARCH = arm的时候,将来在源码目录下去操作的arch/arm目录。CROSS_COMPILE用来指定交叉编译工具链的路径和前缀。
(7) CROSS_COMPILE = xxx和ARCH = xxx和O=xxx这些都可以在make时通过命令行传参的方式传给顶层Makefile。
所以有时候你会看到别人编译内核时:make O=/tmp/mykernel ARCH=arm CROSS_COMPILE=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
2: 链接脚本分析
(1) 分析连接脚本的目的就是找到整个程序的entry
(2) kernel的连接脚本并不是直接提供的,而是提供了一个汇编文件vmlinux.lds.S,然后在编译的时候再去编译这个汇编文件得到真正的链接脚本vmlinux.lds。
(3) vmlinux.lds.S在arch/arm/kernel/目录下。
(4) 思考:为什么linux kernel不直接提供vmlinux.lds而要提供一个vmlinux.lds.S然后在编译时才去动态生成vmlinux.lds呢?
猜测:.lds文件中只能写死,不能用条件编译。但是我们在kernel中链接脚本确实有条件编译的需求(但是lds格式又不支持),于是乎kernel工作者找了个投机取巧的方法,就是把vmlinux.lds写成一个汇编格式,然后汇编器处理的时候顺便条件编译给处理了,得到一个不需要条件编译的vmlinux.lds。
(5) 入门在哪里?从vmlinux.lds中ENTRY(stext)可以知道入口符号是stext,在SI中搜索这个符号,发现arch/arm/kernel/目录下的head.S和head-nommu.S中都有。
(6) head.S是启用了MMU情况下的kernel启动文件,相当于uboot中的start.S。head-nommu.S是未使用mmu情况下的kernel启动文件。
(1) kernel的Makefile写法和规则等和uboot的Makefile是一样的,甚至Makefile中的很多内容都是一样的。
(2) kernel的Makefile比uboot的Makefile要复杂,这里我们并不会一行一行的详细分析。
(3) Makefile中只有一些值得关注的我会强调一下,其他不强调的地方暂时可以不管。
(4) Makefile中刚开始定义了kernel的内核版本号。这个版本号挺重要(在模块化驱动安装时会需要用到),要注意会查,会改。
(5) 在make编译内核时,也可以通过命令行给内核makefile传参(跟uboot配置编译时传参一样)。譬如make O=xxx可以指定不在源代码目录下编译,而到另外一个单独文件夹下编译。
(6) kernel的顶层Makefile中定义了2个变量很重要,一个是ARCH,一个是CROSS_COMPILE。ARCH决定当前配置编译的路径,譬如ARCH = arm的时候,将来在源码目录下去操作的arch/arm目录。CROSS_COMPILE用来指定交叉编译工具链的路径和前缀。
(7) CROSS_COMPILE = xxx和ARCH = xxx和O=xxx这些都可以在make时通过命令行传参的方式传给顶层Makefile。
所以有时候你会看到别人编译内核时:make O=/tmp/mykernel ARCH=arm CROSS_COMPILE=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
2: 链接脚本分析
(1) 分析连接脚本的目的就是找到整个程序的entry
(2) kernel的连接脚本并不是直接提供的,而是提供了一个汇编文件vmlinux.lds.S,然后在编译的时候再去编译这个汇编文件得到真正的链接脚本vmlinux.lds。
(3) vmlinux.lds.S在arch/arm/kernel/目录下。
(4) 思考:为什么linux kernel不直接提供vmlinux.lds而要提供一个vmlinux.lds.S然后在编译时才去动态生成vmlinux.lds呢?
猜测:.lds文件中只能写死,不能用条件编译。但是我们在kernel中链接脚本确实有条件编译的需求(但是lds格式又不支持),于是乎kernel工作者找了个投机取巧的方法,就是把vmlinux.lds写成一个汇编格式,然后汇编器处理的时候顺便条件编译给处理了,得到一个不需要条件编译的vmlinux.lds。
(5) 入门在哪里?从vmlinux.lds中ENTRY(stext)可以知道入口符号是stext,在SI中搜索这个符号,发现arch/arm/kernel/目录下的head.S和head-nommu.S中都有。
(6) head.S是启用了MMU情况下的kernel启动文件,相当于uboot中的start.S。head-nommu.S是未使用mmu情况下的kernel启动文件。
相关文章推荐
- 内核移植(四)——Makefile和链接脚本分析
- ARM架构内核启动分析-head.S(1.1、vmlinux.lds 链接脚本分析)
- TQ2440 学习笔记—— 34、移植 Linux 内核【 Makefile 分析 】
- ARM-Linux内核移植之(一)——内核启动流程分析 .
- linux 2.6内核makefile分析
- Linux 内核 Makefile 体系简单分析
- 嵌入式Linux内核移植相关代码分析
- 【嵌入式Linux学习七步曲之第四篇 Linux内核移植】PPC Linux启动流程分析
- U-boot1.1.6移植之Makefile分析(一)——推荐linux/android驱动初学者必看文章
- 嵌入式Linux内核移植相关代码分析
- Linux 内核 Makefile 体系简单分析
- Linux 3.0内核Makefile分析
- Arm linux 内核移植及系统初始化过程分析
- linux 2.6内核makefile分析
- 嵌入式Linux内核移植相关代码分析
- 嵌入式Linux内核移植相关代码分析
- ARM-Linux移植之(一)——内核启动流程分析
- Linux 内核 Makefile 体系简单分析
- Linux 内核 Makefile 体系简单分析
- Linux 内核 Makefile 体系简单分析