# Linux Kernel 2.6.32 Build 我的環境是: * Ubuntu 16.04 x64 * qemu * linux-2.6.32 * busybox-1.31.0 目錄: mykernel |--linux-2.6.32 |--busybox-1.31.0 --- ## qemu $ sudo apt-get install qemu qemu-system ## Linux kernel 編譯 $ wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.gz $ tar zxvf linux-2.6.32.tar.gz $ cd linux-2.6.32/ $ sudo apt-get install libncurses5-dev build-essential kernel-package $ make mrproper $ make menuconfig $ make $ make all $ make modules ### make menuconfig 編譯前配置參數 KernelHacking --> [*]Compile the kernel with debug info [*]Compile the kernel with frame pointers [ ]Write protect kernel read-only data structures Processor type and features--> [ ]Paravirtualized guest support ### make 1.修改**linux-2.6.32/arch/x86/vdso/Makefile**中: 28行 VDSO_LDFLAGS_vdso.lds = -m elf_x86_64 的 "-m elf_x86_64" 改成 "-m64" 72行 VDSO_LDFLAGS_vdso32.lds = -m elf_i386 的 "-m elf_i386" 改成 "-m32" 2.修改**linux-2.6.32/drivers/net/igbvf/igbvf.h**中: 128行 struct page page; 把這個註解掉 3.修改**linux-2.6.32/kernel/timeconst.pl**中: 373行 defined(@val) 改成 @val ### gcc-4.9 把原本的**gcc-5.3**降版成**gcc-4.9**才能成功編譯 $ sudo apt-get install g++-4.9 $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 20 $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 10 $ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 20 $ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 10 $ sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30 $ sudo update-alternatives --set cc /usr/bin/gcc $ sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30 $ sudo update-alternatives --set c++ /usr/bin/g++ 改回來 $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 60 ## busybox $ wget https://busybox.net/downloads/busybox-1.31.0.tar.bz2 $ tar -jxvf busybox-1.31.0.tar.bz2 $ cd busybox-1.31.0 $ make menuconfig $ make install ### make menuconfig 編譯前配置參數 Busybox Settings -> Build Options --> [*] Build Busybox as a static binary Linux System Utilities --> [ ] Support mounting NFS file system Networking Utilities --> [ ] inetd ### file system 在編譯好後,busybox目錄下有個**_install** $ cd _install $ mkdir proc sys dev etc etc/init.d $ vim etc/init.d/rcS #!/bin/sh mount -t proc proc /proc mount -t sysfs proc /sys /sbin/mdev -s $ chmod +x etc/init.d/rcS 此時是在**_install**下 $ find . | cpio -o --format=newc > ../rootfs.img ## Run 在**linux-2.6.32**下運行 $ qemu-system-x86_64 -m 512 -kernel arch/x86_64/boot/bzImage -initrd ../busybox-1.31.0/rootfs.img -append "root=/dev/ram rdinit=/sbin/init" $ qemu-system-x86_64 -m 512 -kernel arch/x86_64/boot/bzImage -initrd ../busybox-1.31.0/rootfs.img -append "root=/dev/ram rdinit=/sbin/init console=ttyS0" --nographic -s -S (gdb) target remote localhost:1234 ![大功告成](https://i.imgur.com/ur8XT6U.jpg) ## Reference * http://pwn4.fun/2017/04/17/Linux%E5%86%85%E6%A0%B8%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8%EF%BC%88%E4%B8%80%EF%BC%89%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/ * https://www.cnblogs.com/hac425/p/9416886.html * https://blog.csdn.net/ytusdc/article/details/77980915 * https://jacobpan3g.github.io/cn/2017/09/01/solve-kernel2.6.36-build-error-in-ubuntu16.04/ * https://zhuanlan.zhihu.com/p/105069730