Skip to content

Commit 09d4812

Browse files
iksaifmichal42
authored andcommitted
scripts: add extract-vmlinux
This script can be used to extract vmlinux from a compressed kernel image (bzImage, etc..). It's inspired from (a subset of) extract-ikconfig. It's something a lot of people have been looking for (mainly people with xen < 4 that doesn't support bzImages at all). Signed-off-by: Corentin Chary <corentincj@iksaif.net> Signed-off-by: Michal Marek <mmarek@suse.cz>
1 parent 322a8b0 commit 09d4812

1 file changed

Lines changed: 62 additions & 0 deletions

File tree

scripts/extract-vmlinux

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#!/bin/sh
2+
# ----------------------------------------------------------------------
3+
# extract-vmlinux - Extract uncompressed vmlinux from a kernel image
4+
#
5+
# Inspired from extract-ikconfig
6+
# (c) 2009,2010 Dick Streefland <dick@streefland.net>
7+
#
8+
# (c) 2011 Corentin Chary <corentin.chary@gmail.com>
9+
#
10+
# Licensed under the GNU General Public License, version 2 (GPLv2).
11+
# ----------------------------------------------------------------------
12+
13+
check_vmlinux()
14+
{
15+
# Use readelf to check if it's a valid ELF
16+
# TODO: find a better to way to check that it's really vmlinux
17+
# and not just an elf
18+
readelf -h $1 > /dev/null 2>&1 || return 1
19+
20+
cat $1
21+
exit 0
22+
}
23+
24+
try_decompress()
25+
{
26+
# The obscure use of the "tr" filter is to work around older versions of
27+
# "grep" that report the byte offset of the line instead of the pattern.
28+
29+
# Try to find the header ($1) and decompress from here
30+
for pos in `tr "$1\n$2" "\n$2=" < "$img" | grep -abo "^$2"`
31+
do
32+
pos=${pos%%:*}
33+
tail -c+$pos "$img" | $3 > $tmp 2> /dev/null
34+
check_vmlinux $tmp
35+
done
36+
}
37+
38+
# Check invocation:
39+
me=${0##*/}
40+
img=$1
41+
if [ $# -ne 1 -o ! -s "$img" ]
42+
then
43+
echo "Usage: $me <kernel-image>" >&2
44+
exit 2
45+
fi
46+
47+
# Prepare temp files:
48+
tmp=$(mktemp /tmp/vmlinux-XXX)
49+
trap "rm -f $tmp" 0
50+
51+
# Initial attempt for uncompressed images or objects:
52+
check_vmlinux $img
53+
54+
# That didn't work, so retry after decompression.
55+
try_decompress '\037\213\010' xy gunzip
56+
try_decompress '\3757zXZ\000' abcde unxz
57+
try_decompress 'BZh' xy bunzip2
58+
try_decompress '\135\0\0\0' xxx unlzma
59+
try_decompress '\211\114\132' xy 'lzop -d'
60+
61+
# Bail out:
62+
echo "$me: Cannot find vmlinux." >&2

0 commit comments

Comments
 (0)