|
| 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