编译Linux内核没有zImage,Linux内核的编译(ARM-Linux)

本文介绍了在编译Linux 2.6.38内核针对ARM平台时可能遇到的问题及解决办法。包括在配置内核时选择正确目录、解决make命令错误以及修复编译选项导致的错误。通过修改makefile设置CROSS_COMPILE变量,成功编译出zImage。

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

首先,要有一个内核文件,好比个人是Linux-2.6.38,固然若是要选择Linux版本的话,应了解相应Linux版本的基础知识:

Linux内核版本有两种:稳定版和开发版 ,Linux内核版本号由3组数字组成:第一位数.第二位数.第三位数linux

第一位数:目前发布的内核主版本。app

第二位数:偶数表示稳定版本;奇数表示开发中版本。ui

第三位数:版本的发布号。this

例1:Linux 2.6.38 ,spa

第一位数:   2 , 主版本号code

第二位数:   6 , 次版本号,表示稳定版本(由于是偶数)blog

第三位数:38 , 版本的发布号。教程

因此在选择Linux时,应选择一个较稳定版本的Linux内核,即第二位数为偶数的Linux版本。开发

在编译Linux内核时,须要配置内核,能够使用如下指令中的一个:get

make config

make menuconfig

make xconfig

make gconfig

其中,config是基于文本的最为传统的配置界面,不推荐使用;menuconfig是基于文本菜单的配置界面;xconfig要求QT被安装;gconfig要求GTK+被安装。

一开始我傻乎乎的在U-boot文件夹下使用命令,用了好几回发现一直不对。。。

可能不少人会在编译内核和模块的时候发现不少问题,在这里我也简单地列举下,我遇到的几个问题和最终解决的方法。

一、make xxx_defconfig时,出现错误。

我在~/linux-2.6.38/arch/arm/configs中,找到了s3c6400_defconfig,而后我在终端打开该文件夹

cd /root/linux-2.6.38/arch/arm/configs

#错误的

而后出现了两个错误,第一个是我按照教程执行 make s3c6400_defconfig 时出现错误“make: 没有什么能够作的为 `s3c6400_defconfig'。”

第二个是我试了下 make menuconfig 时出现错误“make: *** 没有规则能够建立目标“menuconfig”。 中止。”

然后,我在网上搜索缘由,我发现我打开的文件夹是错的,应该打开Linux内核文件夹。

因此,解决方案也很简单,以下:

cd /root/linux-2.6.38#make s3c6400_defconfig #开始写的是这个后来发现友善之臂的这个竟然没有LCD驱动,因此用的是

cp config_mini6410_a70 .config

固然,也简单解释一下,cd 后面跟的是你Linux内核文件夹的地址!make 后面跟的是你要的XXX的默认配置文件

二、在执行make zImage时出错,错误提示以下:

cc1: error: unrecognized command line option "-mlittle-endian"cc1: error: unrecognized command line option"-mapcs"cc1: error: unrecognized command line option"-mno-sched-prolog"kernel/bounds.c:1:0: error: unknown ABI (apcs-gnu) for -mabi= switchkernel/bounds.c:1:0: error: bad value (armv4t) for -march= switchkernel/bounds.c:1:0: error: bad value (arm9tdmi) for -mtune= switchmake[1]: *** [kernel/bounds.s] 错误 1make:*** [prepare0] 错误 2

以后发现是gcc路径错误。

更改也显得比较容易,不过比较坑爹,有几个点须要注意。

若是和我同样是arm-linux交叉编译的话,首先在终端运行

arm-linux-gcc -v

在个人电脑是提示是这样的:

Using built-inspecs.

COLLECT_GCC=arm-linux-gcc

COLLECT_LTO_WRAPPER=/opt/opt/FriendlyARM/toolschain/4.5.1/bin/../libexec/gcc/arm-none-linux-gnueabi/4.5.1/lto-wrapper

Target: arm-none-linux-gnueabi

请看清楚上面两个点:一个是COLLECT_GCC,一个是COLLECT_LTO_WRAPPER。这两个解决这个问题的关键。

若是不是作的arm-linux交叉编译的话,也同样找到gcc和对应路径。

而后,打开linux内核文件夹(如个人是在/root/linux-2.6.38)下的makefile找到以下这么一段:

*/Makefile

export KBUILD_BUILDHOST :=$(SUBARCH)

#ARCH?=$(SUBARCH)

ARCH?=arm

CROSS_COMPILE?= $(CONFIG_CROSS_COMPILE:"%"=%)

将其进行修改,改为以下:

*/Makefile

export KBUILD_BUILDHOST :=$(SUBARCH)

#ARCH?=$(SUBARCH)

ARCH :=arm

CROSS_COMPILE := GCC的地址/GCC名去掉结尾GCC后剩余部分

#请拷贝修改的时候经过一下大脑。。。

例如,个人修改好后是这样的:

*/Makefile

export KBUILD_BUILDHOST :=$(SUBARCH)

#ARCH?=$(SUBARCH)

ARCH :=arm

CROSS_COMPILE := /opt/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-

咱们能够看到CROSS_COMPILE后面跟的是以前须要特别之一的两个点,一个是COLLECT_GCC,一个是COLLECT_LTO_WRAPPER。

CROSS_COMPILE后面的部分就是COLLECT_LTO_WRAPPER的地址部分,加上斜杠‘/’,再加上COLLECT_GCC中gcc前面的部分,如个人是arm-linux-gcc,因此最后跟的是arm-linux-。

固然,请拷贝修改的时候开动一下大脑,彻底拷贝是没有用的,路径是不一样的。。。。

三、在执行make zImage时再次出错,出现error: 'TASK_INTERRUPTIBLE' undeclared (first use in this function)等一大串的东西,这个解决比较简单,只须要在对应C文件,加上头文件 #include 就能够解决了。

以后运行:

make zImage

make modules

就能够在源代码根目录下生成未压缩的内核映像vmlinux和内核富豪表文件system.map,以及arch/arm/boot下获得的压缩的内核映像zImage。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值