Home | History | Annotate | Download | only in scripts
      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 (at] streefland.net>
      7 #
      8 # (c) 2011      Corentin Chary <corentin.chary (at] 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
     63