我的 Ubuntu 安装上的 vmlinux 在哪里?

我的 Ubuntu 安装上的 vmlinux 在哪里?

我正在尝试创业轮廓,我在这一步遇到了一个问题:

opcontrol --vmlinux=/path/to/vmlinux

Ubuntu 没有名为 vmlinux 的软件包,当我执行 时locate vmlinux,我得到了很多文件:

/usr/src/linux-headers-2.6.28-14/arch/h8300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-14/arch/m68k/kernel/vmlinux-std.lds
/usr/src/linux-headers-2.6.28-14/arch/m68k/kernel/vmlinux-sun3.lds
/usr/src/linux-headers-2.6.28-14/arch/mn10300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-14/arch/sh/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-14/arch/x86/boot/compressed/vmlinux_32.lds
/usr/src/linux-headers-2.6.28-14/arch/x86/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-14/include/asm-generic/vmlinux.lds.h
/usr/src/linux-headers-2.6.28-15/arch/h8300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-15/arch/m68k/kernel/vmlinux-std.lds
/usr/src/linux-headers-2.6.28-15/arch/m68k/kernel/vmlinux-sun3.lds
/usr/src/linux-headers-2.6.28-15/arch/mn10300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-15/arch/sh/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-15/arch/x86/boot/compressed/vmlinux_32.lds
/usr/src/linux-headers-2.6.28-15/arch/x86/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-15/include/asm-generic/vmlinux.lds.h
/usr/src/linux-headers-2.6.28-16/arch/h8300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-16/arch/m68k/kernel/vmlinux-std.lds
/usr/src/linux-headers-2.6.28-16/arch/m68k/kernel/vmlinux-sun3.lds
/usr/src/linux-headers-2.6.28-16/arch/mn10300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-16/arch/sh/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-16/arch/x86/boot/compressed/vmlinux_32.lds
/usr/src/linux-headers-2.6.28-16/arch/x86/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-16/include/asm-generic/vmlinux.lds.h

哪一个是我要找的?

答案1

它应该在您的/boot目录中 - mu Ubuntu 实际上有类似的压缩版本vmlinuz-2.6.28-16-generic

我无法回答 oprofile 是否可以与它们配合使用。

答案2

在 Ubuntu 下获取的最简单(且非黑客)的方法vmlinux添加 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)

答案3

嗯,我只是想把这个作为对 @paxdiablo 的上述回答的评论,但找不到评论按钮?无论如何……

问题是该vmlinuz文件是压缩的 - 而为了调试目的,您需要一个未压缩的vmlinux文件(最好是一个用调试符号构建的文件 - vmlinuzUbuntu 默认的文件没有调试符号,因为它们没有符号)。

现在,可以将解压到vmlinuz一个vmlinux文件中 - 但是,这并不容易;首先,您必须找到vmlinuz压缩文件开始处的字节偏移量,然后使用ddzcat仅解压必要的部分。详细说明如下:“[ubuntu] 如何追踪这个错误? - Ubuntu 论坛 - 帖子 #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

希望这些能帮到你,

干杯!

答案4

这是一个老问题,旧的答案对我来说不再有用(ubuntu 14.04)。

  1. 首先,vmlinux是可选的oprofile,您只需要它来显示内核内部发生的情况,没有它就可以进行用户空间分析。更多内容请阅读文档

  2. 如果你还需要vmlinux添加 ddebs 存储库(厚颜无耻地来自 ubuntu 的 wiki):

    codename=$(lsb_release -c | awk  '{print $2}')
    sudo tee /etc/apt/sources.list.d/ddebs.list << EOF
    deb http://ddebs.ubuntu.com/ ${codename} main restricted universe multiverse
    deb http://ddebs.ubuntu.com/ ${codename}-security main restricted universe multiverse
    deb http://ddebs.ubuntu.com/ ${codename}-updates  main restricted universe multiverse
    deb http://ddebs.ubuntu.com/ ${codename}-proposed main restricted universe multiverse
    EOF
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ECDCAD72428D7C01
    
  3. 然后为你的内核安装调试符号。每次升级内核后,都必须执行此操作,以便uname获取正确的内核版本。请随意删除与旧内核相关的软件包。

    sudo apt-get update
    sudo apt-get install linux-image-$(uname -r)-dbgsym
    
  4. 安装此包后,你可以在这里找到该vmlinux文件

    /usr/lib/debug/boot/vmlinux-$(uname -r)
    

相关内容