android包含完整linux内核,【Android内核】下载编译android kernel

本文介绍如何准备交叉编译工具链并编译Android内核映像。内容包括配置环境变量、获取内核源代码、设定交叉编译参数及最终的内核编译过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译linux内核映像

a)准备交叉编译工具链

android代码树中有一个prebuilt项目,包含了我们编译内核所需的交叉编译工具。

注意:虽然Prebuilt下包含了交叉编译工具,但是编译时有可能会出现“/bin/sh: arm-eabi-gcc: not found”这样的错误,因此最好从CodeSourcery上面载用于交叉编译的工具链:

选择   EABI

解压缩交叉编译工具链:

$ cd /usr/local/

$ sudo cp ~/arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

$ sudo tar jxvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

此时会解压出来一个叫做arm-2010q1的一个目录,这里面就是工具链了。

设置一下环境变量:

$ export PATH=$PATH:/usr/local/arm2007q3/bin

好了,到此,基本的内核编译环境就搞好了。

b)设定环境变量

$ emacs ~/.bashrc

增加如下两行:

export PATH=$PATH:~/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin

export ARCH=arm

保存后,同步变化:

$ source ~/.bashrc

c)获得合适的内核源代码

$ cd ~/android

获得内核源代码仓库

$ git clone git://android.git.kernel.org/kernel/common.git   kernel

$ cd kernel

$ git branch

显示

* android-2.6.27

说明你现在在android- 2.6.27这个分支上,也是kernel/common.git的默认主分支。

显示所有head分支:

$ git branch -a

显示

* android-2.6.27

remotes/origin/HEAD -> origin/android-2.6.27

remotes/origin/android-2.6.25

remotes/origin/android-2.6.27

remotes/origin/android-2.6.29

remotes/origin/android-goldfish-2.6.27

remotes/origin/android-goldfish-2.6.29

我们选取最新的android-goldfish-2.6.29,其中goldfish是 android的模拟器模拟的CPU。

$ git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29

$ git branch

显示

android-2.6.27

* android-goldfish-2.6.29

我们已经工作在android-goldfish-2.6.29分支上了。

d)设定交叉编译参数

打开kernel目录下的Makefile文件,

1. ARCH        ?= $(SUBARCH) 改为: ARCH        ?= arm

2. 把CROSS_COMPILE指向刚才下载的prebuilt中的arm-eabi编译器

CROSS_COMPILE ?= arm-eabi-

注意:如果是按照上述方法重新下载的交叉编译工具则按照下面方法修改

CROSS_COMPILE ?=arm-none-linux-gnueabi-

这个就是刚刚的下载和解压的工具链的前缀了,旨在告诉make,在编译的时候要使用我们的工具链。

(Juexun注:以下第3点在最新的源码中已经解决,不做修改也不会出现错误,本文保留仅作为备注)

3. 把LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\

$(call ld-option, -Wl$(comma)–build-id,))

这一行注释掉,并且添加一个空的LDFLAGS_BUILD_ID定义,如下:

LDFLAGS_BUILD_ID =

把它注释掉的原因是目前android的内核还不支持这个选项。--build-id选项,主要是用于在生成的elf

可执行文件中加入一个内置的id,这样在core dump,或者debuginfo的时候就可以很快定位这个模块是

哪次build的时候弄出来的。这样就可以避免,每次都把整个文件做一遍效验,然后才能得到该文件的是由哪次build产生的。对于内核开发者来说,这是很不错的想法,可以节约定位模块版本和其影响的时间。

目前,该功能还出于early stage的状态,未来的android或许会支持,但至少目前的版本是不支持的。

所以,用#注释掉即可,或者害怕不保险的话,就加入LDFLAGS_BUILD_ID=空,这样即使编译的时候用了,

也只是一个空格而已。

e)编译内核映像

$ cd ~/android/kernel

$ make goldfish_defconfig

$ make

f)测试生成的内核映像

$ emulator -avd myavd -kernel ~/android/kernel/arch/arm/boot/zImage

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值