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

Jas*_*ker 16 linux kernel ubuntu

我正在尝试启动oprofile,但在这一步遇到了问题:

opcontrol --vmlinux=/path/to/vmlinux
Run Code Online (Sandbox Code Playgroud)

Ubuntu 没有叫 vmlinux 的包,当我执行 a 时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
Run Code Online (Sandbox Code Playgroud)

其中哪一个是我要找的?

Sav*_*btz 26

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
Run Code Online (Sandbox Code Playgroud)

并安装内核调试符号:

sudo apt-get update
sudo apt-get install linux-image-$(uname -r)-dbgsym
Run Code Online (Sandbox Code Playgroud)

vmlinux 然后可以在这里找到:

/usr/lib/debug/boot/vmlinux-$(uname -r)
Run Code Online (Sandbox Code Playgroud)


sda*_*aau 12

嗯,只是想将其作为@paxdiablo 对上述答案的评论,但找不到评论按钮?无论如何..

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

现在,可以将 a 解压缩vmlinuzvmlinux文件中 - 然而,这并非微不足道;首先,您必须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
Run Code Online (Sandbox Code Playgroud)

嗯,希望这有帮助,

干杯!

  • 内核的 git 中有一个特殊的脚本用于该 `extract-vmlinux`:https://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=scripts/提取-vmlinux;hb=HEAD (3认同)

小智 1

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

oprofile 是否可以与这些一起工作不是我可以回答的问题。

  • vmlinux 与 vmlinuz 不同 (10认同)
  • oprofile 无法与 `vmlinuz` 一起使用,它需要未压缩的内核。 (5认同)
  • 编辑有什么问题吗?http://superuser.com/posts/62576/revisions (3认同)