【Android内核】下载编译android kernel( 原文地址 http://blog.csdn.net/chizhaolin/archive/2010/07/08/5721539.aspx)
2011-10-20 10:12
555 查看
编译linux内核映像
a)准备交叉编译工具链
android代码树中有一个prebuilt项目,包含了我们编译内核所需的交叉编译工具。
注意:虽然Prebuilt下包含了交叉编译工具,但是编译时有可能会出现“/bin/sh: arm-eabi-gcc: not found” 这样的错误,因此最好从CodeSourcery上面载用于交叉编译的工具链:
http://www.codesourcery.com/gnu_toolchains/arm/download.html
选择 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
a)准备交叉编译工具链
android代码树中有一个prebuilt项目,包含了我们编译内核所需的交叉编译工具。
注意:虽然Prebuilt下包含了交叉编译工具,但是编译时有可能会出现“/bin/sh: arm-eabi-gcc: not found” 这样的错误,因此最好从CodeSourcery上面载用于交叉编译的工具链:
http://www.codesourcery.com/gnu_toolchains/arm/download.html
选择 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
相关文章推荐
- 最开始下载的内核源码和机子的kernel不匹配,参照http://blog.csdn.net/hecant/archive/2007/10/31/1859606.aspx:
- Android Volley完全解析(一),初识Volley的基本用法 转载地址:http://blog.csdn.net/guolin_blog/article/details/17482095
- 转载两篇文章之一(35 岁前程序员要规划好的四件事)原文:http://blog.csdn.net/oiio/archive/2007/02/12/1508001.aspx
- 利用gcc编译出dll文件 http://blog.csdn.net/luedipiaofeng/archive/2007/08/21/1752358.aspx
- 转载两篇文章之二(从程序员到CTO所要培养的六种能力)作者:阿蒙 原文:http://blog.csdn.net/harrymeng/archive/2007/02/07/1503931.aspx
- 学习UpdatePanel控件-看原文有图,本文只为个人备忘(转载:http://blog.csdn.net/ILOVEMSDN/archive/2007/11/11/1879343.aspx)
- 深入理解scrollView的contentOffset等属性转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/deta
- Android开发指南-框架主题-资源和资产 (转http://blog.csdn.net/iefreer/archive/2009/09/06/4526004.aspx)
- android 中用Intent提取缩略图和原始图像(转载http://blog.csdn.net/serverside/archive/2010/05/28/5631480.aspx)
- Android应用程序使用Google Map (转http://blog.csdn.net/iefreer/archive/2009/09/20/4572879.aspx)
- 如何在cmd下切换不同版本的Python 原文:windows 安装python2 与python3 共存 地址:http://blog.csdn.net/liulucaro/article/de
- ASP.net输出JS脚步的类(无AJAX框架)(原作者发布地址http://blog.csdn.net/zhoufoxcn/archive/2008/04/21/2312440.aspx)
- MTK task (原文 http://blog.csdn.net/yanwuxufeng/archive/2010/07/24/5762361.aspx)
- 关于Windows核心编程的编译环境http://blog.csdn.net/lihaishan/archive/2007/09/17/1788891.aspx
- ASP.net输出JS脚步的类(无AJAX框架)(原作者发布地址http://blog.csdn.net/zhoufoxcn/archive/2008/04/21/2312440.aspx)
- Android初学者常见问题解析(1)(转http://blog.csdn.net/Alinaxz/archive/2010/04/19/5503214.aspx)
- 直接调用类成员函数地址(转载自http://blog.csdn.net/shamozhihuzhubohu/archive/2010/07/30/5776979.aspx)
- ASP.net输出JS脚步的类(无AJAX框架)(原作者发布地址http://blog.csdn.net/zhoufoxcn/archive/2008/04/21/2312440.aspx)
- 大虾的地址:http://blog.csdn.net/AbnerChai/
- 设计模式读书笔记(读后感) 摘自:http://blog.csdn.net/shanhe/archive/2004/12/12/214122.aspx