您的位置:首页 > 其它

内核编译过程及相关错误解答(elf_i386错误)

2012-06-25 14:53 323 查看
建议将本文全部看完之后再开始编译内核,不要一开始就着这步骤来,因为在里面会有一些需要修改的地方,而且编译内核时用的时间比较长,所以如果出错之后再改再编译会浪费比较多的时间,在配置时注意FileSystem项的配置。还有在编译的时候会有很多的警告,基本上都是某变量定义了,但是未使用。这些变量是linux内核为以后的扩展留下来的,不用在意。
编译内核的步骤:

1.在kernel.org的网站上下载源码
http://www.kernel.org/pub/linux/kernel/v2.6
2.将下载的源码放在/usr/src目录下,解压。我下载的是2.6.32.27.tar.bz2的源码。

3.进入2.6.32.27的目录,配置内核。
配置内核的方式有4种:

make config

make menuconfig

make xconfig

make oldconfig

这四条命令的区别如下:

make config是基于文本的最为传统的配置界面,即字符界面。比较适合在dos下使用。

make menuconfig:基于文本选单的配置界面,比较适合在终端字符下使用。

Make xconfig:基于图形窗口模式的配置界面,可以直接通过鼠标来选择。

Make oldconfig:只是对一些新功能进行配置。

配置完之后会在/usr/src/linux-2.6.32.27/的目录下生成一个.config的配置文件。如果再配置一次或者多次,就会有.oldconfig的配置文件,记录上一次的配置。

4.编译:

a.make dep:第一个命令make dep实际上读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要。不过这条命令在2.6及以后的内核编译中都不再需要。如果执行就会出现如下的提示:

root@org:/usr/src/linux# make dep

*** Warning: make dep is unnecessary now.

b.make clean:删除前面步骤留下的文件,以避免出现一些错误。如果是第一次编译就不需要了。

c.make zImage或者make bzImage

这两个命令会在下面的目录 /usr/src/linux-2.6.32.27/arch/i386/boot$

中创建文件zImage或者bzImage,这两个文件都是一个链接文件,

lrwxrwxrwx 1 root root 22 2011-12-02 14:00 bzImage -> ../../x86/boot/bzImage

/86/boot下的bzImage文件即为已压缩的内核。

zImage是用gzip压缩的,适合存储在软盘上的内核。bzImage是更大的超过软盘空间限制的压缩内核

d.make modules:编译生成相应的模块。

e.make modules_install:编译模块。

这条语句执行完之后,会在/lib/modules的目录下生成2.6.32.27的目录,该目录下即为编译过的模块。

/lib/modules/x.y.z是模块在系统中的标准目录。

f.make install:安装内核,该命令执行了一下三个步骤(有的可能版本可能make install执行的步骤不全,你可以按照下面的三个步骤自己挨个执行也可以):

(1)把压缩内核映象拷贝到/boot目录下, 并创建相应的System.map符号链接;
(2)修改bootloader的配置文件;

(3)调用mkinitrd(如果是ubuntu则用mkinitramfs命令)程序创建内核的initrd映象,然后修改/boot/grub/grub.cfg文件。如果自己更新的话使用update-grub2命令就可以了。
grub的更新是根据/boot目录下的文件来更新的,在修改grub.cfg文件之前可以先查看一下在/boot目录下是否有你刚编译的内核的initrd.img-x.y.z System.map-x.y.z config-x.y.z vmlinuz-x.y.z文件,x.y.z是内核的版本号,如果没有应该是make install的步骤没做全,如果缺少initrd文件的话,新的内核是没法启动的,最好再打开grub.cfg文件查看你的新内核的部分的最后一句是否有关于initrd的语句,如果没有照着grub.cfg文件中其他内核的语句写一下,当然前提是在你的/boot目录下要有initrd.img-x.y.z文件,如果没有可以通过
mkinitramfs -o /boot/initrd.img-x.y.z来实现。
mkinitramfs 命令实在ubuntu下使用的,其他的使用mkinitrd命令。
g.reboot(重启)

在编译内核过程中遇到的问题及解决方法:

1.root@org:/usr/src/linux# make menuconfig

*** Unable to find the ncurses libraries or the

*** required header files.

*** 'make menuconfig' requires the ncurses libraries.

***

*** Install ncurses (ncurses-devel) and try again.

***

make[1]: *** [scripts/kconfig/dochecklxdialog] 错误 1

make: *** [menuconfig] 错误 2

解决方法:

根据网上资料的提示进行如下的安装过程:

1.sudo apt-get install ncurses

如果安装失败,软件包ncurses还没有可供安装的候选者.就先安装libncurses*

2.sudo apt-get install libncurses*

3.安装完之后查看kernel-package是否已安装:

wjj@org:/usr/src/linux$apt-cache policy kernel-package

kernel-package:

已安装: (无)

候选软件包:12.036+nmu1

版本列表:

12.036+nmu1 0

500 http://cn.archive.ubuntu.com/ubuntu/ oneiric/universe i386 Packages

上面的结果表示kernel-package没有安装好。所以下面安装kernel-package:sudo apt-get install kernel-package

3.安装好kernel-package之后再查看build-essential的安装状态:

wjj@org:/usr/src/linux$ apt-cache policy build-essential

build-essential:

已安装: 11.5ubuntu1

候选软件包:11.5ubuntu1

版本列表:

*** 11.5ubuntu1 0

500 http://cn.archive.ubuntu.com/ubuntu/ oneiric/main i386 Packages

100 /var/lib/dpkg/status

表示已安装。如果没有安装则apt-get install

至于这些包是什么作用,我并不是很清楚。

现在make menconfig可以执行了。
接下来make menuconfig可以了,但是make xconfig还是有问题.根据错误提示还得安装qt库:

sudo apt-get install libqt3-headers libqt3-mt-dev

sudo apt-get install libqt3-compat-headers

然后就ok了!make xconfig也可以配置了。

Make xconfig的配置方法很简单:直接用鼠标选择就好了。

Make config:是通过字符界面的提示,输入y/n/m

Make menconfig的配置方法如下:
配置界面的使用方法(至于各个配置的选项代表的意思可以查阅其它资料,如果是用笔记本安装要更加注意,因为配置不好的话会导致无法启动新编译的内核,FileSystem这个选项的配置尤为重要)

(1)在菜单方式的配置界面上可用上下方向键来在各菜单之间移动

(2)在标有"---->" 标志的地方按回车键进入下级菜单

(3)按两次<ESC>或选择<Exit>则返回到上级菜单

(4)按“ 键或选择下面的 <Help>则可看到配置帮助信息h”

(5)按<Tab> 键则在各控制选项之间移动

(6) 表示包含该功能选项配置在内核中,M 表示以模块的方式编译到内核中,N 表示Y

该功能选项不进行编译

(7)设置状态在 [ ] 或 < > 中以 “* “(选择), “M “(模块), 空格(除外)来表示.
下面是make menuconfig的界面:



下面是make xconfig的界面:



下面是make config的界面:



make oldconfig的我就不例举了。
问题2.make bzImage提示如下错误(这个错误不是每个人都会遇到的,可以用gcc--help查看你的gcc版本,如果你的版本是4.6或者4.6之后的应该会有下面的问题,如果比4.6的早就不会出现这个问题):

gcc: 错误: elf_i386:没有那个文件或目录

make[2]: *** [arch/x86/vdso/vdso32-int80.so.dbg] 错误 1

make[1]: *** [arch/x86/vdso] 错误 2

make: *** [arch/x86] 错误 2

解决方法:

这个问题是由于 gcc 4.6 不再支持 linker-style 架构。将 arch/x86/vdso/Makefile 中,

以 VDSO_LDFLAGS_vdso.lds 开头所在行的 "-m elf_x86_64" 替换为 "-m64"。

以 VDSO_LDFLAGS_vdso32.lds 开头所在行的 "-m elf_x86" 替换为 "-m32"。

问题3:make modules的错误(如果你在编译内核时正在使用的内核比较新的话会出现下面的问题,我在3.0.0-13上编译2.6.32.27的内核是出现下面的问题,但是在2.6.32.32上编译时没有下面的问题)



根据提示查看源码:



解决方案:将第一个struct page* Page注释掉,因为我觉的这样效果是一样的。
问题4:reboot后grub未启动,或者是没有2.6.32.27的选项。

解决方法:将grub.cfg中的timeout全赋值为10。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: