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