16

我想从vmlinuz生成System.map,因为大多数机器没有System.map文件。实际上,vmlinuz被压缩为vmlinuz或bzImage。

有什么工具或脚本可以做到这一点?

我试过:

dd if=/boot/vmlinuz skip=`grep -a -b -o -m 1 -e $'\x1f\x8b\x08\x00' /boot/vmlinuz | cut -d: -f 1` bs=1 | zcat > /tmp/vmlinux

它失败了:

zcat: stdin: not in gzip format
32769+0 records in
32768+0 records out
4

4 回答 4

22

要从内核映像中提取未压缩的内核,您可以使用内核树目录中的extract-vmlinux脚本scripts(至少在内核版本 3.5 中可用)(如果您收到类似的错误

mktemp:无法创建临时文件 /tmp/vmlinux-XXX:参数无效

您需要在脚本中替换$(mktemp /tmp/vmlinux-XXX)为)。$(mktemp /tmp/vmlinux-XXXXXX)命令是/path/to/kernel/tree/scripts/extract-vmlinux <kernel image> >vmlinux

如果提取的内核二进制文件包含符号信息,您应该能够使用同一子目录System.map中的脚本创建文件。mksysmap这里的命令是NM=nm /path/to/kernel/tree/scripts/mksysmap vmlinux System.map

¹ 我的发行版附带的内核映像似乎已被剥离,因此脚本无法获取符号。

于 2012-08-17T09:00:08.763 回答
2

正如 Abrixas2 所写,您将需要一个带有符号信息的内核映像来创建 System.map 文件,而打包的 vmlinuz 映像中不太可能包含符号。但是,我可以验证您原始帖子中的脚本是否使用 '-e' 替换为 '-P' 和 '$' 已删除,即

$ dd if=vmlinuz-3.8.0-19-generic skip=`grep -a -b -o -m 1 -P '\x1f\x8b\x08\x00' vmlinuz-3.8.0-19-generic | 剪切-d: -f 1` bs=1 | zcat > /tmp/vmlinux
gzip: stdin: 解压OK,尾随垃圾被忽略
于 2013-09-03T19:51:31.333 回答
0

我在ubuntu linux上。
您可以更改$'\037\213\010\000'"$(echo '\037\213\010\000')"in sh

bash$ N=$(grep -abo -m1  $'\037\213\010\000' vmlinuz-4.13.0-37-generic | awk -F: '{print $1+1}') && 
tail -c +$N vmlinuz-4.13.0-37-generic | gzip -d > /tmp/vmlinuz
于 2018-04-23T20:51:42.737 回答
0

试试这个 :

dd if=vmlinuz bs=1 skip=24584 | zcat > vmlinux

24584 = 24576 + 8

什么时候

od -A d -t x1 vmlinuz | grep '1f 8b 08 00'

....... 0  1  2  3  .  .  .  .  8  
0024576 24 26 27 00 ae 21 16 00 1f 8b 08 00 7f 2f 6b 45

请享用 !

于 2021-11-01T18:32:16.497 回答