linux-yocto/scripts/extract-vmlinux
Helge Deller db139d71c4 extract-vmlinux: Check for uncompressed image as fallback
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: Helge Deller <deller@gmx.de>
2018-10-17 08:18:01 +02:00

1.7 KiB
Executable File

#!/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 " >&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