Ubuntu上编译Linux-2.6.18的过程及问题

时间:2021-10-05 09:19:36
Ubuntu上编译Linux-2.6.18的过程及问题
环境:虚拟机,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.cUbuntu上编译Linux-2.6.18的过程及问题.sched.text+0x1314): undefined reference to `__mutex_lock_slowpath'
mutex.cUbuntu上编译Linux-2.6.18的过程及问题.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&nbsp;
sudo ln -s gcc-4.4 gcc
sudo mv g++ g++.bak
sudo ln -s g++-4.4 g++&nbsp;

再重新编译
编译完成后, 在 arch/i386/boot目录中出现bzImage映象文件.