xref: /linux/scripts/extract-vmlinux (revision a530a36bb548bbd441402b736f17339183ff53fd)
109d48127SCorentin Chary#!/bin/sh
24317cf95SThomas Gleixner# SPDX-License-Identifier: GPL-2.0-only
309d48127SCorentin Chary# ----------------------------------------------------------------------
409d48127SCorentin Chary# extract-vmlinux - Extract uncompressed vmlinux from a kernel image
509d48127SCorentin Chary#
609d48127SCorentin Chary# Inspired from extract-ikconfig
709d48127SCorentin Chary# (c) 2009,2010 Dick Streefland <dick@streefland.net>
809d48127SCorentin Chary#
909d48127SCorentin Chary# (c) 2011      Corentin Chary <corentin.chary@gmail.com>
1009d48127SCorentin Chary#
1109d48127SCorentin Chary# ----------------------------------------------------------------------
1209d48127SCorentin Chary
1309d48127SCorentin Charycheck_vmlinux()
1409d48127SCorentin Chary{
15*b9f75396SJeremy Linton	if file "$1" | grep -q 'Linux kernel.*boot executable' ||
16*b9f75396SJeremy Linton		readelf -h "$1" > /dev/null 2>&1
17*b9f75396SJeremy Linton	then
18*b9f75396SJeremy Linton		cat "$1"
1909d48127SCorentin Chary		exit 0
20*b9f75396SJeremy Linton	fi
2109d48127SCorentin Chary}
2209d48127SCorentin Chary
2309d48127SCorentin Charytry_decompress()
2409d48127SCorentin Chary{
2509d48127SCorentin Chary	# The obscure use of the "tr" filter is to work around older versions of
2609d48127SCorentin Chary	# "grep" that report the byte offset of the line instead of the pattern.
2709d48127SCorentin Chary
2809d48127SCorentin Chary	# Try to find the header ($1) and decompress from here
2909d48127SCorentin Chary	for	pos in `tr "$1\n$2" "\n$2=" < "$img" | grep -abo "^$2"`
3009d48127SCorentin Chary	do
3109d48127SCorentin Chary		pos=${pos%%:*}
3209d48127SCorentin Chary		tail -c+$pos "$img" | $3 > $tmp 2> /dev/null
3309d48127SCorentin Chary		check_vmlinux $tmp
3409d48127SCorentin Chary	done
3509d48127SCorentin Chary}
3609d48127SCorentin Chary
3709d48127SCorentin Chary# Check invocation:
3809d48127SCorentin Charyme=${0##*/}
3909d48127SCorentin Charyimg=$1
4009d48127SCorentin Charyif	[ $# -ne 1 -o ! -s "$img" ]
4109d48127SCorentin Charythen
4209d48127SCorentin Chary	echo "Usage: $me <kernel-image>" >&2
4309d48127SCorentin Chary	exit 2
4409d48127SCorentin Charyfi
4509d48127SCorentin Chary
4609d48127SCorentin Chary# Prepare temp files:
4709d48127SCorentin Charytmp=$(mktemp /tmp/vmlinux-XXX)
4809d48127SCorentin Charytrap "rm -f $tmp" 0
4909d48127SCorentin Chary
5009d48127SCorentin Chary# That didn't work, so retry after decompression.
5109d48127SCorentin Charytry_decompress '\037\213\010' xy    gunzip
5209d48127SCorentin Charytry_decompress '\3757zXZ\000' abcde unxz
5309d48127SCorentin Charytry_decompress 'BZh'          xy    bunzip2
5409d48127SCorentin Charytry_decompress '\135\0\0\0'   xxx   unlzma
5509d48127SCorentin Charytry_decompress '\211\114\132' xy    'lzop -d'
5647a18a2dSAdam Borowskitry_decompress '\002!L\030'   xxx   'lz4 -d'
5747a18a2dSAdam Borowskitry_decompress '(\265/\375'   xxx   unzstd
5809d48127SCorentin Chary
59db139d71SHelge Deller# Finally check for uncompressed images or objects:
60db139d71SHelge Dellercheck_vmlinux $img
61db139d71SHelge Deller
6209d48127SCorentin Chary# Bail out:
6309d48127SCorentin Charyecho "$me: Cannot find vmlinux." >&2
64