环境:虚拟机,Ubuntu 32bit, Linux 3.13
编译过程中一共遇到三个问题,详见内文。
1.预备工作 安装必需的软件包 (为内核编译做准备)
首先我们升级软件(包)库:
sudo apt-get update
然后我们安装所有需要的软件包:
sudo apt-get install kernel-package libncurses5-dev fakeroot wget bzip2
(libncurses5-dev 提供curse库,便于后面使用menuconfig命令)
2 前提: 构建编译环境
需要make, gcc等工具, 在Ubuntu中, 只需一条简单命令就可安装所有的源代码编译工具:
# sudo apt-get install build-essential
3、清除从前编译内核时残留的.o 文件和不必要的关联。临时文件、中间文件和配置文件 (为了重新编译新内核)
sudo cd /usr/src/linux
sudo make clean(删除生成的目标文件, 来实现对驱动的重新编译. 保留 .conf文件)
sudo make mrproper(全部删除不保留 .conf文件)
sudo make distclean(全部删除,彻底,)(推存)(三个清除命令根据需要选择)
4. 到官方网站下载内核 http://kernel.org/pub/linux/kernel/v2.6
解包到 /usr/src 目录下,命令:
sudo tar -xvjf linux-2.6.18.tar.bz2
进入到编译目录中,此后的所有操作均在该目录下进行。
sudo cd /usr/src/linux-2.6.18/
5.配置内核,命令:
sudo make menuconfig
配置好了,保存,在目录中会创建.config文件,编译的时候是根据此文件进行。
6.开始编译:
sudo make bzImage
遇到第一个错误
SHIPPED scripts/genksyms/parse.c
HOSTCC scripts/genksyms/parse.o
HOSTLD scripts/genksyms/genksyms
CC scripts/mod/empty.o
HOSTCC scripts/mod/mk_elfconfig
MKELF scripts/mod/elfconfig.h
HOSTCC scripts/mod/file2alias.o
HOSTCC scripts/mod/modpost.o
HOSTCC scripts/mod/sumversion.o
scripts/mod/sumversion.c: In function ‘get_src_version’:
scripts/mod/sumversion.c:384:16: error: ‘PATH_MAX’ undeclared (first use in this function)
char filelist[PATH_MAX + 1];
^
scripts/mod/sumversion.c:384:16: note: each undeclared identifier is reported only once for each function it appears in
scripts/mod/sumversion.c:384:7: warning: unused variable ‘filelist’ [-Wunused-variable]
char filelist[PATH_MAX + 1];
^
make[2]: *** [scripts/mod/sumversion.o] Error 1
make[1]: *** [scripts/mod] Error 2
make: *** [scripts] Error 2
解决方法:
Sudo vi scripts/mod/sumversion.c
Add this line:
#include <limits.h>
重新编译,遇到第二个错误
include/asm/elf.h:150:32: note: in definition of macro ‘VDSO_SYM’
(VDSO_BASE + (unsigned long)(x) - VDSO_PRELINK)
^
LDS arch/i386/kernel/vsyscall.lds
AS arch/i386/kernel/vsyscall-int80.o
AS arch/i386/kernel/vsyscall-note.o
SYSCALL arch/i386/kernel/vsyscall-int80.so
gcc: error: elf_i386: No such file or directory
gcc: error: unrecognized command line option ‘-m’
make[1]: *** [arch/i386/kernel/vsyscall-int80.so] Error 1
make: *** [arch/i386/kernel] Error 2
解决办法:
在arch/i386/kernel 文件夹内的Makefile把-m elf_i386 改为 -m32
再重新编译
遇到第三个问题
AR arch/i386/lib/lib.a
GEN .version
CHK include/linux/compile.h
UPD include/linux/compile.h
CC init/version.o
LD init/built-in.o
LD .tmp_vmlinux1
kernel/built-in.o: In function `.text.lock.mutex':
mutex.c.sched.text+0x1314): undefined reference to `__mutex_lock_slowpath'
mutex.c.sched.text+0x131e): undefined reference to `__mutex_unlock_slowpath'
make: *** [.tmp_vmlinux1] Error 1
经过网络搜索,判断可能是gcc版本过高导致,机器上的gcc版本是4.8
安装低版本gcc4.4
sudo apt-get install gcc-4.4
sudo apt-get install g++-4.4
这两条命令就够了,安装完了。现在系统里有两个gcc了,一个4.8,一个4.4。
先把目录切换到/usr/bin下。
sudo mv gcc gcc.bak
sudo ln -s gcc-4.4 gcc
sudo mv g++ g++.bak
sudo ln -s g++-4.4 g++
再重新编译
编译完成后, 在 arch/i386/boot目录中出现bzImage映象文件.