ほとんどのマシンには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
カーネルイメージから非圧縮カーネルを抽出するには、カーネルツリーの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
_です。
¹ディストリビューションに同梱されているカーネルイメージが削除されているようであるため、スクリプトはシンボルを取得できませんでした。
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、末尾のガベージは無視されます
私は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
_