Skip to content
Snippets Groups Projects
  • Helge Deller's avatar
    db139d71
    extract-vmlinux: Check for uncompressed image as fallback · db139d71
    Helge Deller authored
    
    As on x86-64 and other architectures, the boot kernel on parisc (vmlinuz
    and bzImage) contains a full compressed copy of the final kernel
    executable (vmlinux.bin.gz), which one should be able to extract with
    the extract-vmlinux script.
    
    But on parisc extracting the kernel with extract-vmlinux fails.
    Currently the script first checks if the given file is an ELF file
    (which is true on parisc) and if so returns it.  Thus on parisc we
    unexpectedly get back the vmlinuz boot file instead of the uncompressed
    vmlinux image.
    
    This patch fixes this issue by reverting the logic. It now first tries
    to find a compression signature in the given file and if that fails it
    checks the file itself as fallback.
    
    Signed-off-by: default avatarHelge Deller <deller@gmx.de>
    db139d71
    History
    extract-vmlinux: Check for uncompressed image as fallback
    Helge Deller authored
    
    As on x86-64 and other architectures, the boot kernel on parisc (vmlinuz
    and bzImage) contains a full compressed copy of the final kernel
    executable (vmlinux.bin.gz), which one should be able to extract with
    the extract-vmlinux script.
    
    But on parisc extracting the kernel with extract-vmlinux fails.
    Currently the script first checks if the given file is an ELF file
    (which is true on parisc) and if so returns it.  Thus on parisc we
    unexpectedly get back the vmlinuz boot file instead of the uncompressed
    vmlinux image.
    
    This patch fixes this issue by reverting the logic. It now first tries
    to find a compression signature in the given file and if that fails it
    checks the file itself as fallback.
    
    Signed-off-by: default avatarHelge Deller <deller@gmx.de>
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
extract-vmlinux 1.68 KiB
#!/bin/sh
# ----------------------------------------------------------------------
# extract-vmlinux - Extract uncompressed vmlinux from a kernel image
#
# Inspired from extract-ikconfig
# (c) 2009,2010 Dick Streefland <dick@streefland.net>
#
# (c) 2011      Corentin Chary <corentin.chary@gmail.com>
#
# Licensed under the GNU General Public License, version 2 (GPLv2).
# ----------------------------------------------------------------------

check_vmlinux()
{
	# Use readelf to check if it's a valid ELF
	# TODO: find a better to way to check that it's really vmlinux
	#       and not just an elf
	readelf -h $1 > /dev/null 2>&1 || return 1

	cat $1
	exit 0
}

try_decompress()
{
	# The obscure use of the "tr" filter is to work around older versions of
	# "grep" that report the byte offset of the line instead of the pattern.

	# Try to find the header ($1) and decompress from here
	for	pos in `tr "$1\n$2" "\n$2=" < "$img" | grep -abo "^$2"`
	do
		pos=${pos%%:*}
		tail -c+$pos "$img" | $3 > $tmp 2> /dev/null
		check_vmlinux $tmp
	done
}

# Check invocation:
me=${0##*/}
img=$1
if	[ $# -ne 1 -o ! -s "$img" ]
then
	echo "Usage: $me <kernel-image>" >&2
	exit 2
fi

# Prepare temp files:
tmp=$(mktemp /tmp/vmlinux-XXX)
trap "rm -f $tmp" 0

# That didn't work, so retry after decompression.
try_decompress '\037\213\010' xy    gunzip
try_decompress '\3757zXZ\000' abcde unxz
try_decompress 'BZh'          xy    bunzip2
try_decompress '\135\0\0\0'   xxx   unlzma
try_decompress '\211\114\132' xy    'lzop -d'
try_decompress '\002!L\030'   xxx   'lz4 -d'
try_decompress '(\265/\375'   xxx   unzstd

# Finally check for uncompressed images or objects:
check_vmlinux $img

# Bail out:
echo "$me: Cannot find vmlinux." >&2