forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 <[email protected]> Signed-off-by: Michal Marek <[email protected]>
- Loading branch information
Showing
1 changed file
with
62 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
#!/bin/sh | ||
# ---------------------------------------------------------------------- | ||
# extract-vmlinux - Extract uncompressed vmlinux from a kernel image | ||
# | ||
# Inspired from extract-ikconfig | ||
# (c) 2009,2010 Dick Streefland <[email protected]> | ||
# | ||
# (c) 2011 Corentin Chary <[email protected]> | ||
# | ||
# Licensed under the GNU General Public License, version 2 (GPLv2). | ||
# ---------------------------------------------------------------------- | ||
|
||
check_vmlinux() | ||
{ | ||
# Use readelf to check if it's a valid ELF | ||
# TODO: find a better to way to check that it's really vmlinux | ||
# and not just an elf | ||
readelf -h $1 > /dev/null 2>&1 || return 1 | ||
|
||
cat $1 | ||
exit 0 | ||
} | ||
|
||
try_decompress() | ||
{ | ||
# The obscure use of the "tr" filter is to work around older versions of | ||
# "grep" that report the byte offset of the line instead of the pattern. | ||
|
||
# Try to find the header ($1) and decompress from here | ||
for pos in `tr "$1\n$2" "\n$2=" < "$img" | grep -abo "^$2"` | ||
do | ||
pos=${pos%%:*} | ||
tail -c+$pos "$img" | $3 > $tmp 2> /dev/null | ||
check_vmlinux $tmp | ||
done | ||
} | ||
|
||
# Check invocation: | ||
me=${0##*/} | ||
img=$1 | ||
if [ $# -ne 1 -o ! -s "$img" ] | ||
then | ||
echo "Usage: $me <kernel-image>" >&2 | ||
exit 2 | ||
fi | ||
|
||
# Prepare temp files: | ||
tmp=$(mktemp /tmp/vmlinux-XXX) | ||
trap "rm -f $tmp" 0 | ||
|
||
# Initial attempt for uncompressed images or objects: | ||
check_vmlinux $img | ||
|
||
# That didn't work, so retry after decompression. | ||
try_decompress '\037\213\010' xy gunzip | ||
try_decompress '\3757zXZ\000' abcde unxz | ||
try_decompress 'BZh' xy bunzip2 | ||
try_decompress '\135\0\0\0' xxx unlzma | ||
try_decompress '\211\114\132' xy 'lzop -d' | ||
|
||
# Bail out: | ||
echo "$me: Cannot find vmlinux." >&2 |