xref: /linux-6.15/scripts/extract-vmlinux (revision 09d48127)
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