编译linux3.16内核心得

LaurenceMee 8年前

来自: http://my.oschina.net/wuqingyi/blog/614472


这次编译使用的内核源码是3.16.
1.安装build-essential:sudo apt-get install build-essential
2.安装交叉编译器:sudo apt-get install gcc-4.7-arm-linux-gnueabi(如果是sudo apt-get install gcc-arm-linux-gnueabi默认是安装最新版的,即5.0版本,但是编译的时候一直会报说找不到include/linux/compiler-gcc5.h,于是卸载了,换成4.7,但是编译的时候又报错说没有arm-linux-gnueabi-gcc,原来4.7版本的gcc是arm-linux-gnueabi-gcc-4.7,于是更改内核源码根目录下的Makefile,把CC= $(CROSS_COMPILE)gcc改成CC= $(CROSS_COMPILE)gcc-4.7,顺利编译!)
3.下载linux-3164.tar.xz并解压。
4.进入解压后的文件夹,打开Makefile文件,替换Makefile中变量ARCH和CROSS-COMPILE:

    ARCH := arm      CROSS-COMPILE:= arm-linux-gnueabi-

    
5.配置内核

如果想使用默认模板,使用命令:

make xxxx_defconfig

xxxx_defconfig在arch/arm/configs/中,你想使用哪个模板就make arch/arm/configs/文件夹中的文件的文件名。
.如果想自己配置内核,可以利用

make config                              #基于文本的最为传统的配置界面,不推荐使用  make menuconfig                    #基于文本选单的配置界面,字符终端下推荐使用,需要安装libncurse-dev  make xconfig                            #基于图形窗口模式的配置界面,Xwindow 下推荐使用,需要安装libqt-dev

 三个命令中的一种开启配置系统进行内核的详细配置,重点关注system type(设置cpu类型)。
6.使用“make zImage”或“make bzImage” 建立的为压缩的内核映像。
7.制作根文件系统(成功编译并可以作为根文件系统的busybox是用gcc-arm-linux-gnueabi 的5.0版本编译,但是我又用4.7版本编译了一下,还是能编译成功,但能不能用还没试.)
下载busybox.
编译busybox的时候,按照http://fangjian0518.blog.163.com/blog/static/5591965620112171420757/这篇文章来做.
在构建/lib目录的时候,文章是通过arm-linux-readelf -a bin/busybox | grep 'Shared' (我用的是arm-linux-gnueabi-readelf不是arm-linux-readelf)来确定需要复制哪些库的,但是我这样做没有显示任何东西,我看到文章中用这条命令以后显示:
0x00000001 (NEEDED)                     Shared library: [libcrypt.so.1]
0x00000001 (NEEDED)                     Shared library: [libm.so.6]
0x00000001 (NEEDED)                     Shared library: [libc.so.6]
于是我grep 'NEEDED'而不是Shared
 0x00000001 (NEEDED)                     共享库:[libm.so.6]
 0x00000001 (NEEDED)                     共享库:[libc.so.6]
 0x00000001 (NEEDED)                     共享库:[ld-linux.so.3]
文章最后一步是制作根文件系统镜像,但是我一直无法成功,于是参照http://www.linuxidc.com/Linux/2015-07/119764.htm这篇文章制作.运行的时候一直使用这个命令:qemu-system-arm -M vexpress-a9 -m 256M -kernel zImage -nographic -append "root=/dev/mtdblock0 console=ttyAMA0" -sd rootfs.ext3
结果一直报错.后来尝试了一下,把root=/dev/mtdblock0改成root=/dev/mmcblk0,竟然可以工作了.