forked from mirrors/linux
		
	 db139d71c4
			
		
	
	
		db139d71c4
		
	
	
	
	
		
			
			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>
		
			
				
	
	
		
			64 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			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 <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
 |