Bash 从vmlinuz或bzImage提取vmlinux

Bash 从vmlinuz或bzImage提取vmlinux,bash,linux-kernel,kernel,Bash,Linux Kernel,Kernel,我想从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

我想从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

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

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

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

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


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

正如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 | cut -d: -f 1` bs=1 | zcat > /tmp/vmlinux gzip: stdin: decompression OK, trailing garbage ignored $dd if=vmlinuz-3.8.0-19-generic skip=`grep-a-b-o-m1-P'\x1f\x8b\x08\x00'vmlinuz-3.8.0-19-generic | cut-d:`f1`bs=1 | zcat>/tmp/vmlinux gzip:stdin:解压正常,尾部垃圾被忽略 我在ubuntu linux上。
您可以在sh中将
$'\037\213\010\000'
更改为
“$(echo'\037\213\010\000')”

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

谢谢你的帮助!!我从3.5.2中得到了脚本,结果是[root@lwq2test]#./extract-vmlinux.sh vmlinuz extract-vmlinux.sh:找不到vmlinux.Hm,我实际上首先遇到了相同的问题,原因是脚本未能创建所需的临时文件/tmp/vmlinux XXX(在我的例子中,我需要将其更改为/tmp/vmlinux-XXXXXX以使其正常工作,所需的X'e数应该在mktemp的手册页面中提及)。3.5.2版的extract vmlinux脚本也使用了三个X'e,而不是六个X'e,因此这可能是问题所在……对于ARM来说,它因“extract vmlinux:找不到vmlinux”而失败:kernel tree“你是指内核源代码树吗?是的,可以从中获得的内核树。你确定吗?提取的文件中没有符号;-(这似乎不适用于最新版本的grep。它对我有效。非常好。节省了我大量的时间。无需下载源代码或手动步骤进行解压缩。