web-dev-qa-db-ja.com

vmlinuzまたはbzImageからvmlinuxを抽出します

ほとんどのマシンにはSystem.mapファイルがないため、vmlinuzから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
15
hellolwq

カーネルイメージから非圧縮カーネルを抽出するには、カーネルツリーのscriptsディレクトリから_extract-vmlinux_スクリプトを使用できます(少なくともカーネルバージョン3.5で使用可能)(次のようなエラーが発生した場合)

mktemp:一時ファイルを作成できません/ tmp/vmlinux-XXX:引数が無効です

スクリプトでは、$(mktemp /tmp/vmlinux-XXX)$(mktemp /tmp/vmlinux-XXXXXX)に置き換える必要があります。コマンドは_/path/to/kernel/tree/scripts/extract-vmlinux <kernel image> >vmlinux_です。

抽出されたカーネルバイナリにシンボル情報が含まれている場合は、同じサブディレクトリからmksysmapスクリプトを使用して_System.map_ファイルを作成できるはずです。ここでのコマンドは_NM=nm /path/to/kernel/tree/scripts/mksysmap vmlinux System.map_です。

¹ディストリビューションに同梱されているカーネルイメージが削除されているようであるため、スクリプトはシンボルを取得できませんでした。

17
Abrixas2

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、末尾のガベージは無視されます
2
Daniel Genin

私はubuntulinuxを使用しています。
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
_
0
mug896