xref: /openbmc/linux/scripts/extract-vmlinux (revision 4317cf95)
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{
1509d48127SCorentin Chary	# Use readelf to check if it's a valid ELF
1609d48127SCorentin Chary	# TODO: find a better to way to check that it's really vmlinux
1709d48127SCorentin Chary	#       and not just an elf
1809d48127SCorentin Chary	readelf -h $1 > /dev/null 2>&1 || return 1
1909d48127SCorentin Chary
2009d48127SCorentin Chary	cat $1
2109d48127SCorentin Chary	exit 0
2209d48127SCorentin Chary}
2309d48127SCorentin Chary
2409d48127SCorentin Charytry_decompress()
2509d48127SCorentin Chary{
2609d48127SCorentin Chary	# The obscure use of the "tr" filter is to work around older versions of
2709d48127SCorentin Chary	# "grep" that report the byte offset of the line instead of the pattern.
2809d48127SCorentin Chary
2909d48127SCorentin Chary	# Try to find the header ($1) and decompress from here
3009d48127SCorentin Chary	for	pos in `tr "$1\n$2" "\n$2=" < "$img" | grep -abo "^$2"`
3109d48127SCorentin Chary	do
3209d48127SCorentin Chary		pos=${pos%%:*}
3309d48127SCorentin Chary		tail -c+$pos "$img" | $3 > $tmp 2> /dev/null
3409d48127SCorentin Chary		check_vmlinux $tmp
3509d48127SCorentin Chary	done
3609d48127SCorentin Chary}
3709d48127SCorentin Chary
3809d48127SCorentin Chary# Check invocation:
3909d48127SCorentin Charyme=${0##*/}
4009d48127SCorentin Charyimg=$1
4109d48127SCorentin Charyif	[ $# -ne 1 -o ! -s "$img" ]
4209d48127SCorentin Charythen
4309d48127SCorentin Chary	echo "Usage: $me <kernel-image>" >&2
4409d48127SCorentin Chary	exit 2
4509d48127SCorentin Charyfi
4609d48127SCorentin Chary
4709d48127SCorentin Chary# Prepare temp files:
4809d48127SCorentin Charytmp=$(mktemp /tmp/vmlinux-XXX)
4909d48127SCorentin Charytrap "rm -f $tmp" 0
5009d48127SCorentin Chary
5109d48127SCorentin Chary# That didn't work, so retry after decompression.
5209d48127SCorentin Charytry_decompress '\037\213\010' xy    gunzip
5309d48127SCorentin Charytry_decompress '\3757zXZ\000' abcde unxz
5409d48127SCorentin Charytry_decompress 'BZh'          xy    bunzip2
5509d48127SCorentin Charytry_decompress '\135\0\0\0'   xxx   unlzma
5609d48127SCorentin Charytry_decompress '\211\114\132' xy    'lzop -d'
5747a18a2dSAdam Borowskitry_decompress '\002!L\030'   xxx   'lz4 -d'
5847a18a2dSAdam Borowskitry_decompress '(\265/\375'   xxx   unzstd
5909d48127SCorentin Chary
60db139d71SHelge Deller# Finally check for uncompressed images or objects:
61db139d71SHelge Dellercheck_vmlinux $img
62db139d71SHelge Deller
6309d48127SCorentin Chary# Bail out:
6409d48127SCorentin Charyecho "$me: Cannot find vmlinux." >&2
65