[RFC] scripts: make extract-vmlinux support ARM vmlinuz
diff mbox

Message ID 1453810236-2082-1-git-send-email-rogershimizu@gmail.com
State New
Headers show

Commit Message

Roger Shimizu Jan. 26, 2016, 12:10 p.m. UTC
vmlinuz on ARM seems is not an ELF, so scripts/extract-vmlinux
need to support such case.

This fix is tested on amd64 and armel platform.

Signed-off-by: Roger Shimizu <rogershimizu@gmail.com>
---

Dear Michal and Russell,

I'm studying ARM booting process, and happened to find scripts/extract-vmlinux
in kernel tree is broken on ARM for long time. [0][1]

[0]: https://bugs.launchpad.net/linaro-ubuntu/+bug/1050453
[1]: https://bugs.linaro.org/show_bug.cgi?id=461

The patch I created looks like dirty hack, and I don't know the status of 
whether vmlinuz is ELF or not on other platforms, so I make this as "RFC".

Please comment. Thank you!

Cheers,
Roger

 scripts/extract-vmlinux | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

Comments

Russell King - ARM Linux Jan. 26, 2016, 1:42 p.m. UTC | #1
On Tue, Jan 26, 2016 at 09:10:36PM +0900, Roger Shimizu wrote:
> vmlinuz on ARM seems is not an ELF, so scripts/extract-vmlinux
> diff --git a/scripts/extract-vmlinux b/scripts/extract-vmlinux
> index 5061abcc2540..d569eb8c8efe 100755
> --- a/scripts/extract-vmlinux
> +++ b/scripts/extract-vmlinux
> @@ -15,7 +15,15 @@ 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
> +	case "$2" in
> +	0|"")
> +		readelf -h $1 > /dev/null 2>&1 || return 1
> +		;;
> +	1|*)
> +	# For ARCH like ARM, vmlinux is not ELF, so we only do the check
> +	# when $2 is 0 or NULL

This comment seems to be misleading - I think you mean "vmlinuz" there,
or maybe "zImage" as the file is named in the kernel build tree to make
it clear what you're referring to.  "vmlinuz" is the name chosen by
distro installers.
Roger Shimizu Jan. 26, 2016, 11:28 p.m. UTC | #2
On Tue, Jan 26, 2016 at 10:42 PM, Russell King - ARM Linux
<linux@arm.linux.org.uk> wrote:
> On Tue, Jan 26, 2016 at 09:10:36PM +0900, Roger Shimizu wrote:
>> vmlinuz on ARM seems is not an ELF, so scripts/extract-vmlinux
>> diff --git a/scripts/extract-vmlinux b/scripts/extract-vmlinux
>> index 5061abcc2540..d569eb8c8efe 100755
>> --- a/scripts/extract-vmlinux
>> +++ b/scripts/extract-vmlinux
>> @@ -15,7 +15,15 @@ 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
>> +     case "$2" in
>> +     0|"")
>> +             readelf -h $1 > /dev/null 2>&1 || return 1
>> +             ;;
>> +     1|*)
>> +     # For ARCH like ARM, vmlinux is not ELF, so we only do the check
>> +     # when $2 is 0 or NULL
>
> This comment seems to be misleading - I think you mean "vmlinuz" there,
> or maybe "zImage" as the file is named in the kernel build tree to make
> it clear what you're referring to.  "vmlinuz" is the name chosen by
> distro installers.

I just add these comment following original comment above.
And even the script name is "extract-vmlinux".

In the check_vmlinux() routine, the target of the check is
decompressed result of
parsed part zImage file.
I guess the original comment is true, it's called vmlinux in kernel build tree.

I hope you can comment:
- whether my hack work for all ARMs (armel/armhf/arm64 etc). I only
tested armel.
- whether there's better way to check ARM's vmlinux

Thank you!

Cheers,
Roger

Patch
diff mbox

diff --git a/scripts/extract-vmlinux b/scripts/extract-vmlinux
index 5061abcc2540..d569eb8c8efe 100755
--- a/scripts/extract-vmlinux
+++ b/scripts/extract-vmlinux
@@ -15,7 +15,15 @@  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
+	case "$2" in
+	0|"")
+		readelf -h $1 > /dev/null 2>&1 || return 1
+		;;
+	1|*)
+	# For ARCH like ARM, vmlinux is not ELF, so we only do the check
+	# when $2 is 0 or NULL
+		;;
+	esac
 
 	cat $1
 	exit 0
@@ -31,7 +39,7 @@  try_decompress()
 	do
 		pos=${pos%%:*}
 		tail -c+$pos "$img" | $3 > $tmp 2> /dev/null
-		check_vmlinux $tmp
+		test $? -eq 0 && check_vmlinux $tmp 1
 	done
 }
 
@@ -53,7 +61,7 @@  check_vmlinux $img
 
 # That didn't work, so retry after decompression.
 try_decompress '\037\213\010' xy    gunzip
-try_decompress '\3757zXZ\000' abcde unxz
+try_decompress '\3757zXZ\000' abcde "unxz --single-stream"
 try_decompress 'BZh'          xy    bunzip2
 try_decompress '\135\0\0\0'   xxx   unlzma
 try_decompress '\211\114\132' xy    'lzop -d'