内核移植(四)——Makefile和链接脚本分析

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启动文件。

时间: 2024-10-12 07:44:33

内核移植(四)——Makefile和链接脚本分析的相关文章

linux 内核移植(四)——Makefile和链接脚本分析

1:Makefile分析 (1) kernel的Makefile写法和规则等和uboot的Makefile是一样的,甚至Makefile中的很多内容都是一样的. (2) kernel的Makefile比uboot的Makefile要复杂,这里我们并不会一行一行的详细分析. (3) Makefile中只有一些值得关注的我会强调一下,其他不强调的地方暂时可以不管. (4) Makefile中刚开始定义了kernel的内核版本号.这个版本号挺重要(在模块化驱动安装时会需要用到),要注意会查,会改. (

u-boot链接脚本分析

eclipse 64位下载地址:http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/kepler/SR1/eclipse-standard-kepler-SR1-win32-x86_64.zip 如果从nand flash 启动,0地址就对应的是nand flash ,nand flash 不能像内存那样去写,通过这个可以判断是否是从nand flash 启动 U-boot最根本

linux 内核移植(七)——rest_init函数分析

代码在start_kernel函数运行的最后到了rest_init()函数中 1:rest_init()函数分析 (1)rest_init中调用kernel_thread函数启动了2个内核线程,分别是:kernel_init和kthreadd (2)调用schedule函数开启了内核的调度系统,从此linux系统开始转起来了. (3)rest_init最终调用cpu_idle函数结束了整个内核的启动.也就是说linux内核最终结束了一个函数cpu_idle.这个函数里面肯定是死循环. (4)简单

ARM链接脚本

1. 概论 每一个链接过程都由链接脚本(linker script, 一般以lds作为文件的后缀名)控制. 链接脚本主要用于规定如何把输入文件内的段放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局. 但你也可以用连接命令做一些其他事情. 2. 基本概念 链接器把一个或多个输入文件合成一个输出文件. 输入文件:  目标文件或链接脚本文件.输出文件:  目标文件或可执行文件.目标文件(包括可执行文件)具有固定的格式, 在UNIX或GNU/Linux平台下, 一般为ELF格式. 若想了解

uboot移植(二)——uboot mkconfig脚本分析

uboot移植(二)--uboot  mkconfig 脚本分析 一:mkconfig脚本的作用 mkconfig是通过传入的参数来脚本用于某个开发板配置uboot,主要是通过判断其输入的参数来创建符号链接文件,使它们指向该开发板对应的配置文件来进行配置. (1)配置CPU架构相关的文件:在include目录下创建asm文件,指向include/asm-arm (2)配置SOC类型相关的文件:include目录下创建regs.h文件,指向include/s5pc110.h include/asm

freescale-sdk linux移植一搭建编译环境脚本host-prepare.sh分析

接下来使用自己的课外休息时间,对基于PowerPC架构freescale-sdk,进行linux移植和分析.主要参考官方文档freescale linux sdk START_HERE.html,首先对搭建编译环境脚本host-prepare.sh分析.在移植系统之前,需要搭建编译环境,安装必要的包,为后期编译系统做准备.很多人看到脚本就头疼,下面是我的分析过程,分析不好的地方可以在下面留言,一起讨论. 一.搭建编译环境脚本分析./scripts/host-prepare.sh [email p

linux脚本: makefile以及链接库

Makefile以及链接库 http://blog.csdn.net/zkf11387/article/details/8039249 Makefile 里 -l和-L的区别  http://blog.csdn.net/dreamxu/article/details/6259206 gcc -o test test.c -L. -lcrexr64 -L.表示在当前目录(.)中查找函数库,-lcrexr64表示使用名为libcrexr64.a的函数库 -L/usr/lib -L/opt/app/o

linux 内核移植和根文件系统的制作

1.1 Linux内核基础知识 在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起. 1.1.1  Linux版本 Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.29.1内核的Makefile中: VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 29 EXTRAVERSION = .1 其 中的“VERSION”和“PATCHLEVEL”组成主版本号,比如2.4.2.5

Linux链接脚本学习--lds(转)

Linux链接脚本学习--lds 一.概论 ld: GNU的链接器. 用来把一定量的目标文件跟档案文件链接在一起,并重新定位它们的数据,链接符号引用. 一般编译一个程序时,最后一步就是运行ld进行链接 每一个链接都被一个链接脚本所控制,这个脚本是用链接命令语言书写的. 二.链接脚本 链接脚本的一个主要目的是描述输入文件中的各个段(数据段,代码段,堆,栈,bss)如何被映射到输出文件中,并控制输出文件的内存排布. 链接器总是使用链接脚本的,如果你不提供,则链接器会使用一个缺省的脚本,这个脚本是被编