UBUNTU编译LINUX内核(UBUNTU下获取VMLINUX
1.vmlinux
vmlinux是一个包括linux kernel的静态链接的可运行文件。文件类型是linux接受的可运行文件格式之中的一个(ELF、COFF或a.out)。
2.vmlinuz
vmlinuz是可引导的,压缩的linux内核,“vm”代表的“virtual memory”。
vmlinuz是vmlinux经过gzip和objcopy(*)制作出来的压缩文件。vmlinuz不仅是一个压缩文件,并且在文件的开头部分内嵌有gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。
vmlinuz是一个统称。有两种详细的表现形式:zImage和bzImage(big zImage)。
zImage和bzImage的差别在于本身的大小和载入到内存的地址不同。zImage是0~640KB,bzImage是1M以上。假设内核比較小。那么能够採用zImage 或bzImage之中的一个,两种方式引导的系统运行时是同样的。大的内核採用bzImage。不能採用zImage。
- 综述
总结起来就是例如以下的几句话:
vmlinux 是ELF文件。即编译出来的最原始的文件。
vmlinuz应该是由ELF文件vmlinux经过OBJCOPY后。并经过压缩后的文件
zImage是vmlinuz经过gzip压缩后的文件,适用于小内核
bzImage是vmlinuz经过gzip压缩后的文件,适用于大内核
总结了网上获取vmlinux的方法:
方法一:
vmlinux
在Ubuntu下获取的最简单(且非hacky)方法是添加ddebs存储库:
echo "deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-security main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | \
sudo tee -a /etc/apt/sources.list.d/ddebs.list
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01
并安装内核调试符号:
sudo apt-get update
sudo apt-get install linux-image-$(uname -r)-dbgsym
vmlinux
然后可以在这里找到:
/usr/lib/debug/boot/vmlinux-$(uname -r)
PS:这种方式我在sudo apt-get update时候始终报错

方法二:
事实是,压缩了vmlinuz
文件-出于调试目的,您需要一个未压缩的vmlinux
文件(最好是一个带有调试符号的文件-Ubuntu附带的默认vmlinuz
-不含调试符号,因为它们被去除了符号) 。
现在,可以将vmlinuz
解压缩到vmlinux
文件中-但是,这并不容易。首先,您必须在vmlinuz
中找到压缩文件开始的字节偏移,然后使用dd
和zcat
仅解压缩必要的部分。详细地,这在“ [ubuntu] How to trace this bug? – Ubuntu Forums – post #4”中进行了解释。简而言之,以下是基于该帖子的示例终端命令日志:
$ od -A d -t x1 /boot/vmlinuz-$(uname -r) | grep '1f 8b 08 00' --colour
0013920 f3 a5 fc 5e 8d 83 70 23 3d 00 ff e0 *1f 8b 08 00*
$ wcalc 13920+12
= 13932
$ dd if=/boot/vmlinuz-$(uname -r) bs=1 skip=13932 | zcat > vmlinux-$(uname -r)
4022132+0 records in
4022132+0 records out
4022132 bytes (4,0 MB) copied, 42,1695 s, 95,4 kB/s
gzip: stdin: decompression OK, trailing garbage ignored
$ file vmlinux-2.6.32-25-generic
vmlinux-2.6.32-25-generic: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped
不明白的可以去baidu或者Google关于vmlinuz解压至vmlinux的相关知识。
方法三:
利用Ubuntu直接编译(我采用的此方法)
首先通过apt-get获取内核代码,当然你可以直接从kernel.org上Git获取代码.
sudo apt-get install linux-source
然后是一些编译需要的
sudo apt-get install libncurses5-dev
将linux-source-4.15.0.tar.bz2解压到/usr/src/目录下
tar -jxf /usr/src/linux-source-4.15.0/linux-source-4.15.0.tar.bz2 -C /usr/src/
获取配置文件
sudo cp /boot/config-4.15.0-88-generic /usr/src/linux-source-4.15.0/.config
然后进入/usr/src/linux-source-4.15.0文件夹中
sudo make -j4
编译要很长一段时间。成功之后在/usr/src/linux-source-4.15.0中就有vmlinux文件了

vmlinux便是我想要的文件,参与内核调试过程所需要的文件。
如果想继续安装内核,执行:
make -j8 && make modules -j8 && make modules-install -j8 && make install -j8
重点:因为编译过程中会有很大的磁盘损耗,切记自己的磁盘空间一定要充足最后空余20G以上。