109d48127SCorentin Chary#!/bin/sh 2*4317cf95SThomas 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