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