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

建议将本文全部看完之后再开始编译内核,不要一开始就着这步骤来,因为在里面会有一些需要修改的地方,而且编译内核时用的时间比较长,所以如果出错 之后再改再编译会浪费比较多的时间,在配置时注意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 -> http://www.cnblogs.com/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

转载于:https://www.cnblogs.com/sankye/articles/2304525.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值