android内核
浅谈Android(安卓)

浅谈Android--嵌入式操作系统Android(读音:[ˈændrɔid],中文俗称安卓)是一个以Linux为基础的半开源操作系统,主要用于移动设备,由Google成立的Open Handset Alliance (OHA,开放手持设备联盟)持续领导与开发中。
--题记.维基百科说起嵌入式系统,曾经在保罗大叔的著作《黑客与画家》里看到多次,然后不明所以,就去查了嵌入式系统。
如果说嵌入式系统给我的第一印象是硬件,那么是我还不知道嵌入式在我生活里已经出现了很多年了。
大到冰箱,自动存款机(ATM),小到电子手表,遥控器。
在维基百科解答后,我对嵌入式直观的理解,是一种特定的植入硬件并极具针对性的计算机系统。
后来慢慢了解嵌入式的软件方面,就知道了嵌入式操作系统,而其中的佼佼者,就是如今已经超越ios,占据半壁江山的Android。
之所以会说Android,原因有二:一,因为Android如今炙手可热,在新一季度的日本手机软件营销额上,以Java等语言为Android系统开发的Apps,疯狂揽金,李开复断言在两年内,中国内地手机游戏软件市场,将会百花齐放;二,我虽并非研究Java也非致力于Android系统,但是Android系统的内核,却是我所熟悉的Linux内核。
而我将自己的开发平台转移到Linux系统,并以Python,Perl以及Lisp语言作为未来的生存工具,所以,就让我们谈一谈Android。
题记中套用维基百科对于Android的介绍,主要的目的,就是为了澄清一件事实“认知”——Android并没有真正的中文名。
Google并没有为Android命名,只有为其版本取名,且翻译成中文:4.2.x Jelly Bean 果冻豆,4.0.x Ice Cream Sandwich 冰激凌三明治,3.x.x HoneyComb 蜂巢,2.3.x Ginger Bread 姜饼。
而“安卓”一词,也是我们自己对其中文简称,就像Facebook并没有为其在中国大陆市场取名一样。
android各版本对应的kernel版本

Donut
甜甜圈
1.6
2009年9月15日 2.6.29
2.0 Eclair
2009年10月26 日 2.6.29
松饼 2.0.1 2.1 2009年12月3日 2010年1月12日
。 部分API进行修改变化 ,BUG修复。 部分API进行修改变化 ,BUG修复。 支持将软件安装至扩展 内存,USB分享器和Wi Fi热点功能,速度和性 能优化。
4.1.2
2012年10月9日
4.2
2012年10月30 日
4.2.1 A new flavor of Jelly Bean 一种新口 味的果冻 豆
4.2.2
3.4.0 (目前miui V5日 4.1.2的内核版本 2013年2月11日 是3.4) 2012年11月28
性能及稳定性的提升 ,一些错误的修正, 优化电池耗电量,增 加续航时间
2.2 Froyo
2010年5月20日 2.6.32
冻酸奶 2.2.1 2.2.2 2011年1月18日 2011年1月22日
存在的bug修复,安全 性的提高,性能提升以 及流畅性提升。 存在的bug修复,修复
了Nexus One中的短 信问题。 2.2.3 2011年11月21 日 2010年12月7日 2011年2月9日 2011年4月28日 2.6.35 2.3.5 2011年7月25日 修复了两个存在的安全 性问题。 Linux Kernel 2.3 2.3.3 2.3.4 Gingerbread 姜饼 2.6.33版代码库移除了 Android代码。 进行了API改进 屏幕截图功能 改进了个别机型的功能 ,优化相机和电池续航 。 修复了语音搜索存在的 bug 增加NFC功能
2.3.6 2.3.7 3.0 3.1 Honeycomb 蜂巢 3.2 3.2.1 3.2.2
Android系统架构及内核简介

Android系统架构及内核简介(来源于ThinkPHP)Android是Google公司开发的基于Linux平台的开源⼿机操作系统,它包括操作系统、中间件、⽤户界⾯和应⽤程序,⽽且不存在任何以往阻碍移动产业创新的专利权障碍,并由Google公司于2007年11⽉5⽇正式发布。
同时,Google公司组建了⼀个开放⼿机联盟,这个联盟由中国移动、摩托罗拉、⾼通、宏达电和T-Mobile等在内的全球30多家技术和⽆线应⽤的领军企业组成,Google通过与运营商、设备制造商、开发商和其他有关各⽅结成深层次的合作伙伴关系,希望借助建⽴标准化、开放式的移动电话软件平台,在移动产业内形成⼀个开放式的⽣态系统;可预见地,⽣产和使⽤基于 Android系统的嵌⼊式⼿持移动设备将是未来的发展趋势,对相应软件的需求量也将⽇趋增长,因此对Android系统内部作⼀个完整和深⼊的分析,对基于Android平台的软件移植和开发是很有益处的。
1 Android系统平台架构对操作系统⽽⾔,必须做到设计合理、层次分明,同时还需考虑整个系统的结构要聚耦适当,Android系统是基于linux内核的,因此还必须具备开源的特性,以符合开源⼈员共同⼯作。
从系统的组成要件来讲,Android平台架构包括硬件设备、板级⽀持包、驱动程序、操作系统内核、程序运⾏库,运⾏框架,应⽤程序等,它们的有机结合和协同⼯作共同完成了整个系统的正常运⾏和对事务的处理。
依据Google开源资料可知,整个系统由Linux内核、程序库、Android Runtime、应⽤程序框架和应⽤程序等5部分组成,,系统架构如图1所⽰。
参照图1,由上⽽下对组成系统各部分的主要组件作以下描述。
1.1 Linux内核Android基于Linux 2.6内核,但并⾮完全照搬内核,⽽是对内核作了部分增删和修改,在Linux 2.6内核的基础上,Android核⼼系统实现了安全性、内存管理、进程管理、⽹络协议栈和驱动模型等功能,Linux内核也同时作为硬件和软件栈之间的抽象层。
华为手机内核代码的编译及刷入教程【通过魔改华为P9AndroidKernel对抗反调试机制】

华为⼿机内核代码的编译及刷⼊教程【通过魔改华为P9AndroidKernel对抗反调试机制】0x00 写在前⾯攻防对⽴。
程序调试与反调试之间的对抗是⼀个永恒的主题。
在安卓逆向⼯程实践中,通过修改和编译安卓内核源码来对抗反调试是⼀种常见的⽅法。
但⽹上关于此类的资料⽐较少,且都是基于AOSP(即"Android 开放源代码项⽬",可以理解为原⽣安卓源码)进⾏修改,然后编译成⼆进制镜像再刷⼊Nexus 或者Pixel 等⾕歌亲⼉⼦⼿机。
但因为⾕歌的亲⼉⼦在国内没有⾏货销售渠道,市场占有率更多的是国产⼿机,⽽修改国产⼿机系统内核的教程却很少,加之部分国产⼿机的安卓内核和主线 AOSP 存在些许差异,照搬原⽣安卓代码的修改⽅法⽆法在国产⼿机上实现某些功能,甚⾄⽆法编译成功。
所以本⽂以某国产⼿机为例,通过研究其内核源码,对关键代码进⾏分析、修改,编译内核、打包成刷机镜像,对全过程予以展⽰。
0x01 常见反调试⼿段及对抗策略简介在安卓程序的开发过程中,反调试的⼿段有很多种,简单列举若⼲:(1) 检测特定进程或端⼝号。
如 IDA Pro 在对安卓应⽤进⾏调试时,需要在⼿机端启动调试程序 android_server ,该调试程序默认开启端⼝23946。
⽬标程序若发现⼿机⾥有 android_server 进程或开启了端⼝23946,⽬标程序就⾃动退出,以达到反调试的⽬的。
(2)检测某些关键⽂件的状态。
如⽬标程序在调试状态时,Linux内核会向部分系统⽂件内写⼊⼀些进程状态信息,包括但不限于向 “ /proc/⽬标程序pid/status ” 这⼀⽂件的 TracerPid 字段写⼊调试进程的 pid 。
有部分程序会检查这些字段,⽐如⽬标程序发现对应的 TracerPid 不等于 0 ,则说明⾃⼰本⾝正在被别的程序调试,⽐如:(Pid为19707的进程正在被Pid为24741的进程调试)(3)检测软件断点。
Android本质上就是一个基于Linux内核的操作系统

Android本质上就是一个基于Linux内核的操作系统。
与Ubuntu Linux、Fedora Linux 类似。
只是Android在应用层专门为移动设备添加了一些特有的支持。
既然Android是Linux内核的系统,那么基本的启动过程也应符合Linux的规则。
如果研究过其他Linux 系统应该了解,一个完整的Linux系统首先会将一个Linux内核装载到内存,也就是编译Linux内核源代码生成的bzImage文件,对于为Android优化的Linux内核源代码会生成zImage文件。
该文件就是Linux内核的二进制版本。
由于zImage在内核空间运行,而我们平常使用的软件都是在应用空间运行(关于内核空间和应用空间的详细描述,可以参考《Android深度探索(卷1):HAL与驱动开发》一书的内容,在后续的各卷中将会对Android的整体体系进行全方位的剖析)。
内核空间和应用空间是不能直接通过内存地址级别访问的,所以就需要建立某种通讯机制。
目前Linux有很多通讯机制可以在用户空间和内核空间之间交互,例如设备驱动文件(位于/dev目录中)、内存文件(/proc、/sys目录等)。
了解Linux的同学都应该知道Linux的重要特征之一就是一切都是以文件的形式存在的,例如,一个设备通常与一个或多个设备文件对应。
这些与内核空间交互的文件都在用户空间,所以在Linux内核装载完,需要首先建立这些文件所在的目录。
而完成这些工作的程序就是本文要介绍的init。
Init是一个命令行程序。
其主要工作之一就是建立这些与内核空间交互的文件所在的目录。
当Linux内核加载完后,要做的第一件事就是调用init程序,也就是说,init是用户空间执行的第一个程序。
在分析init的核心代码之前,还需要初步了解init除了建立一些目录外,还做了如下的工作1. 初始化属性2. 处理配置文件的命令(主要是init.rc文件),包括处理各种Action。
Android与linux的区别与联系

大家都知道Android是基于Linux内核的操作系统,也曾经和Linux基金会因为内核问题产生过分歧,本文将开始对Android的内核进行剖析,主要介绍Android 和Linux之间的关系,后续还会讲到Android系统在Linux系统之上扩展的部分功能和驱动。
虽然Android基于Linux内核,但是它与Linux之间还是有很大的差别,比如Android在Linux内核的基础上添加了自己所特有的驱动程序。
下面我们就来分析一下它们之间究竟有什么关系?android是否能称为一种新的操作系统呢?至少我自己认为不算是,它最多算作一个新的应用程序罢了。
一、Android为什么会选择Linux成熟的操作系统有很多,但是Android为什么选择采用Linux内核呢?这就与Linux的一些特性有关了,比如:1、强大的内存管理和进程管理方案2、基于权限的安全模式3、支持共享库4、经过认证的驱动模型5、Linux本身就是开源项目更多关于上述特性的信息可以参考Linux 2.6版内核的官方文档,这便于我们在后面的学习中更好地理解Android所特有的功能特性。
接下来分析Android 与Linux的关系。
二、Android不是Linux看到这个标题大家可能会有些迷惑,前面不是一直说Android是基于Linux 内核的吗,怎么现在又不是Linux了?迷惑也是正常的,请先看下面几个要点,然后我们将对每一个要点进行分析,看完后你就会觉得Android不是Linux了。
因为它没有本地窗口系统,没有glibc的支持,而且并不包括一整套标准的Linux使用程序,同时增强了Linux以支持其特有的驱动。
1.它没有本地窗口系统什么是本地窗口系统呢?本地窗口系统是指GNU/Linux上的X窗口系统,或者Mac OX X的Quartz等。
不同的操作系统的窗口系统可能不一样,Android并没有使用(也不需要使用)Linux的X窗口系统,这是Android不是Linux的一个基本原因。
第十三章 Android内核驱动——电源管理
第十三章Android内核驱动——电源管理13.1 基本原理Android 中定义了几种低功耗状态:earlysuspend,suspend,hibernation。
●earlysuspend是一种低功耗的状态,某些设备可以选择进入某种功耗较低的状态,比如LCD可以降低亮度或灭掉;●suspend是指除电源管理以外的其他外围模块以及cpu均不工作,只有内存保持自刷新的状态;●hibernation是指所有内存镜像都被写入磁盘中,然后系统关机,恢复后系统将能恢复到“关机”之前的状态。
13.2 电源管理机制的实现电源管理机制的源代码主要在kernel/power/文件夹下面。
main.c文件是整个框架的入口。
用户可以通过读写sys文件/sys/power/state实现控制系统进入低功耗状态。
用户对于/sys/power/state的读写会调用到main.c中的state_store(),用户可以写入const char * const pm_states[] 中定义的字符串,比如“on”,“mem”,“standby”,“disk”。
state_store()首先判断用户写入的是否是“disk”字符串,如果是则调用hibernate()函数命令系统进入hibernation状态。
如果是其他字符串则调用request_suspend_state()(如果未定义CONFIG_EARLYSUSPEND)或者调用enter_state()(如果未定义CONFIG_EARLYSUSPEND)。
request_suspend_state()函数是android相对标准linux改动的地方,它实现在earlysuspend.c 中。
在标准linux内核中,用户通过sysfs 写入“mem”和“standby”时,会直接调用enter_state()进入suspend模式,但在android中则会调用request_suspend_state()函数进入early suspend 状态。
android内核编译方法
解压缩内核: $ mkdir -p android $ cd android $ tar xzvf ../linux-2.6.23-android-m3-rc20.tar.gz 会解压出来一个叫做kernel的目录,google的android的linux内核就在里面了。解压缩交叉编译工具链: $ cd /usr/local/ $ sudo cp ~/arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 . $ sudo tar zxvf arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2此时会解压出来一个叫做arm2007q3的一个目录,这里面就是工具链了。设置一下环境变量: $ export PATH=$PATH:/usr/local/arm2007q3/bin好了,到此,基本的内核编译环境就搞好了。4)现在是要得到android的内核编译参数的配置文件的时候了,该文件需要从已经安装好的android的模拟器中得到才行。所以安装android的sdk也是必须的,这一步不太明白的朋友可以参考我以前发的android命令行体验的文章。首先启动android模拟器,然后通过adb得到模拟器中提供的内核配置文件: $emulator & $adb pull /proc/config.gz .这时候adb工具会连接模拟器,并从它里面下载一个叫做config.gz的文件到你的当前目录下。把它拷贝到你的kernel目录: $cd ~/android/kernel $cp ~/config.gz . 解压缩该文件,并重命名为.config,这一步做了就可以跳过make menuconfig之类的内核参数设置动作了。 $gunzip config.gz $mv config .config5)修改kernel目录中的Makefile文件,用emacs或vi打开该Makefile修改CROSS_COMPILE变量为:CROSS_COMPILE=arm-none-linux-gnueabi-这个就是刚刚的下载和解压的工具链的前缀了,旨在告诉make,在编译的时候要使用我们的工具链。在Makefile中注释掉LDFLAGS_BUILD_ID这个变量:例如将如下定义:LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\ $(call ld-option, -Wl$(comma)--build-id,))修改为:LDFLAGS_BUILD_ID=#LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\# $(call ld-option, -Wl$(comma)--build-id,))把它注释掉的原因是目前android的内核还不支持这个选项。--build-id选项,主要是用于在生成的elf可执行文件中加入一个内置的id,这样在core dump,或者debuginfo的时候就可以很快定位这个模块是哪次build的时候弄出来的。这样就可以避免,每次都把整个文件做一遍效验,然后才能得到该文件的是由哪次build产生的。对于内核开发者来说,这是很不错的想法,可以节约定位模块版本和其影响的时间。目前,该功能还出于early stage的状态,未来的android或许会支持,但至少目前的版本是不支持的。所以,用#注释掉即可,或者害怕不保险的话,就加入LDFLAGS_BUILD_ID=空,这样即使编译的时候用了,也只是一个空格而已。对这个--build-id选项感兴趣的朋友,可以访问下面的网址,它的作者已经解释得非常明白了:/wiki/Releases/FeatureBuildId6)终于可以开始make了。 $ make不出意外的话,应该整个过程都会非常顺利,最终会在~/android/kernel/arch/arm/boot目录下面生成一个zImage,这个就是我们要的内核映像了。7)激动人心的时刻终于到来了,我们可以测试一下刚刚编译出来的内核可以不可以用了。 $emulator -kernel ~/android/kernel/arch/arm/boot/zImage当看到red eye在晃来晃去,最终显示出来android的界面的时候,一颗悬着的心总算放下了。android的proc里面的version如下:# cat versionLinux version 2.6.23 (wayne@wayne) (gcc version 4.2.1 (CodeSourcery Sourcery G++ Lite 2007q3-51)) #1 Sat Jan 19 18:11:44 HKT 2008
Android Kernel Development Part 1
本文主要讲解开发Android平台下的LKM(Linux Kernel Module)的步骤,以及如何使用Android Emulator调试LKM。
一、编译android内核1.首先运行模拟器(emulator命令所在目录为androidsdk/tools/,可将其添加至系统环境变量PATH中)emulator -avd android4注意:本人使用的是android4的版本,android2.x的版本也可使用2.goldfish内核下载git clone /kernel/goldfish.git3.从模拟器中将/proc/config.gz文件复制到goldfish(即kernel)目录cd goldfish/adb pull /proc/config.gz .4.将config.zg解压gunzip config.gzmv config .config5.进行编译make ARCH=arm CROSS_COMPILE=arm-eabi- -j4注意:本人所用arm toolchain为NDKr5c版本,NDKr7所用的gcc 4.4.3版本编译后的模块在加载时会出问题,切莫使用。
也可自己编译arm toolchain6.通过emulator运行刚刚编译好的kernelemulator -kernel /Volumes/Software/Android/kernel/goldfish/arch/arm/boot/zImage -avd android47.通过"About phone",可以查看当前内核信息提示:也可使用如下命令查看内核版本cat /proc/version二、编译"Hello World!"模块,源码详见helloworld.zip1.解压并进入到helloworld目录unzip helloworld.zipcd helloworld2.编译hello模块,编译成功之会将得到hello.komake注意:如果编译时出现下述错误error: variable '__this_module' has initializer but incomplete type需要配置内核选项,首先执行make ARCH=arm CROSS_COMPILE=arm-eabi- menuconfig进入内核配置界面,勾选下列选项[*] Enable loadable module support ---> (选中这一项,按空格即可) [*] Forced module loading(选中上述一项,按回车即可看到此项) [*] Module unloading[*] Forced module unloading注意:修改内核选项后要重新编译内核3.加载编译好的hello.ko模块1)将hello_m.ko复制到模拟器中adb push hello.ko /sdcard/3)加载hello.ko模块adb shellinsmod /sdcard/hello.ko4)通过下述命令打印内核信息,看到"Hello, World!",表示模块加载成功。
Android的系统架构
Android的系统架构Android的系统架构和其它操作系统一样,采用了分层的架构。
android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
Android是以Linux为核心的手机操作平台,作为一款开放式的操作系统,随着Android的快速发展,如今已允许开发者使用多种编程语言来开发Android 应用程序,而不再是以前只能使用Java开发Android应用程序的单一局面,因而受到众多开发者的欢迎,成为真正意义上的开放式操作系统。
在Android中,开发者可以使用Java作为编程语言来开发应用程序,也可以通过NDK使用C/C++作为编程语言来开发应用程序,也可使用SL4A来使用其他各种脚本语言进行编程(如:python、lua、tcl、php等等),还有其他诸如:Qt(qt for android)、Mono(mono for android)等一些著名编程框架也开始支持Android编程,甚至通过MonoDroid,开发者还可以使用C#作为编程语言来开发应用程序。
另外,谷歌还在2009年特别发布了针对初学者的Android Simple 语言,该语言类似Basic语言。
而在网页编程语言方面,JavaScript,ajax,HTML5,jquery、sencha、dojo、mobl、PhoneGap等等都已经支持Android开发。
而在Android系统底层方面,Android使用C/C++作为开发语言。
应用程序(部分)早期的Android应用程序开发,通常通过Android SDK(Android软件开发包)下使用Java作为编程语言来开发应用程序,但通过不同的软件开发包,则使用的编程语言也不同。
例如开发者可以通过Android NDK(Android Native开发包)使用C语言或者C++语言来作为编程语言开发应用程序。
同时谷歌还推出了适合初学者编程使用的Simple语言,该语言类似微软公司的Visual Basic语言。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Google Android操作系统内核编译图文教程 Android中文网.交流和标准的Linux开发流程一样,Android平台开发的一个很重要的基础工作就是对其内核的编译和移植。
本文结合Android的开发文档以及本人的实践经验,简单介绍了Android内核的编译过程,希望有助于对内核移植感兴趣的开发人员。
Android作为Google公司推出的一款手机开发平台,其本身是基于linux 内核的。
Google提供的内核源代码中除了linux部分外,有很大一部分是与虚拟处理器Qemu和模拟硬件平台Goldfish相关的。
所以如果想将Android移植到实际的硬件平台上需要将这部分代码剥离出来。
当然这不是这篇文章的重点,我们现在的目的是要编译出一个可以在模拟器上运行的系统内核,那么,现在就开始我们的工作吧!工作环境及所需软件包系统环境:Redhat Linux 9.0交叉编译器:GNU Toolchain for ARM Processors 下载地址:/gnu_toolchains/arm/download.html其中第一项选择ARM EABI或ARM GNU/Linux,第二项选择IA32 GNU/Linux即可。
此主题相关图片如下:Android内核源代码:linux-2.6.23-android-m5-rc14.tar.gz 下载地址:/p/android/downloads/list注意该内核版本要与你选用的模拟器版本尽量一致。
此主题相关图片如下:Android SDK 下载地址:/android/download_list.html此主题相关图片如下:1.搭建交叉编译环境1) 安装Android SDK: 将android-sdk_m5-rc14_linux-x86.zip解压缩到适当路径下即可使用。
本文将其释放至/usr/local/android_sdk_linux路径下,并将其tools路径添加到PATH中$ export PATH=$PATH:/usr/local/android_sdk_linux/tools2) 安装交叉编译器:将arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 解压缩至/usr/local/arm-2007q3目录下,并将其bin路径添加到PATH中:$ export PATH=$PATH:/usr/local/arm-2007q3/bin此主题相关图片如下:3) 解压缩内核源代码:将linux-2.6.23-android-m5-rc14.tar.gz解压缩,得到kernel文件夹,本文中将其放置在/Android目录下。
2.获取内核编译配置文件交叉编译环境搭建好后需要得到android的内核编译参数的配置文件,该文件需要从android sdk 中的模拟器中得到。
启动android模拟器,然后通过adb得到模拟器中提供的内核配置文件:$emulator &$adb pull /proc/config.gz这时候adb工具会连接模拟器,并从它里面下载一个叫做config.gz的文件到你的当前目录下。
将其移动至kernel目录,解压该文件得到config,将其重命名为.config,这样就可以跳过make config而直接得到Makefile所需要的内核配置文件。
$ gunzip config.gz$ mv config .config此主题相关图片如下:3.修改Makefile首先修改第187行,将CROSS_COMPILE值改为arm-none-linux-gnueabi-,这是我们安装的交叉编译工具链的前缀,修改此处意在告诉make在编译的时候要使用该工具链。
此主题相关图片如下:然后修改第519、520行,将build id 值注释掉,因为目前版本的android 内核不支持该选项。
此主题相关图片如下:4.开始编译在kernel目录下执行make:$ make除个别警告外编译过程一切顺利,最终在/kernel/arch/arm/boot目录下面生成一个zImage,即为编译好的内核镜像了。
此主题相关图片如下:此主题相关图片如下:5.运行该镜像$emulator -kernel ~/android/kernel/arch/arm/boot/zImage 最终效果如图所示。
此主题相关图片如下:参考资料:/Compilation_of_Android_kernel Android中文网.交流编译内核出错:invalid option `abi aapcs-linux461651060372011-1-18 20:50:36 收藏 | 打印 | 投票 | 评论 | 阅读◇字体:[大中小]编译内核出错:invalid option `abi=aapcs-linux''原文地址:/igouwa/blog/item/88b2ed835f5863ab0df4d2e5.html使用旧编译器,编译出错:gouwa@gouwa:~/project/kernel/linux-2.6.29$ arm-linux-gcc -vReading specs from /usr/local/arm/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/specs Configured with: /opt/crosstool/crosstool-0.28/build/arm-linux/gcc-3.4.1-glibc-2.3.2/gcc-3.4.1/configur e --target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2 --with-float=soft --with-headers=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2/arm-linux/include--with-local-prefix=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2/arm-linux--disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-longThread model: posixgcc version 3.4.1错误信息如下:gouwa@gouwa:~/project/kernel/linux-2.6.29$ makescripts/kconfig/conf -s arch/arm/KconfigCHK include/linux/version.hmake[1]: `include/asm-arm/mach-types.h'' is up to date.CHK include/linux/utsrelease.hSYMLINK include/asm -> include/asm-armCC kernel/bounds.scc1: error: invalid option `abi=aapcs-linux''make[1]: *** [kernel/bounds.s] Error 1make: *** [prepare0] Error 2使用新编译器,编译通过(由蓝色部分可看出,该编译器编译对象是EABI的)gouwa@gouwa:~$ arm-linux-gcc -vUsing built-in specs.Target: arm-none-linux-gnueabiConfigured with: /scratch/julian/lite-respin/linux/src/gcc-4.3/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnu eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --enable-shared --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion=''Sourcery G++ Lite 2008q3-72'' --with-bugurl=https:///GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc--with-build-sysroot=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/li bc--with-gmp=/scratch/julian/lite-respin/linux/obj/host-libs-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr--with-mpfr=/scratch/julian/lite-respin/linux/obj/host-libs-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueab i/bin--with-build-time-tools=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueab i/binThread model: posixgcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)错误分析:旧编译器可能是用OABI的,而配置内核时又选择了使用EABI的,修改内核配置:Kernel Features ---->Use the ARM EABIto compile the kernel选上EABI,使用旧编译器再编译,哈哈,通过。