| From d69911a68c865b152a067feaa45e98e6bb0f655b Mon Sep 17 00:00:00 2001 |
| From: Kees Cook <keescook@chromium.org> |
| Date: Mon, 26 Jan 2015 12:58:35 -0800 |
| Subject: x86, build: replace Perl script with Shell script |
| |
| From: Kees Cook <keescook@chromium.org> |
| |
| commit d69911a68c865b152a067feaa45e98e6bb0f655b upstream. |
| |
| Commit e6023367d779 ("x86, kaslr: Prevent .bss from overlaping initrd") |
| added Perl to the required build environment. This reimplements in |
| shell the Perl script used to find the size of the kernel with bss and |
| brk added. |
| |
| Signed-off-by: Kees Cook <keescook@chromium.org> |
| Reported-by: Rob Landley <rob@landley.net> |
| Acked-by: Rob Landley <rob@landley.net> |
| Cc: Anca Emanuel <anca.emanuel@gmail.com> |
| Cc: Fengguang Wu <fengguang.wu@intel.com> |
| Cc: Junjie Mao <eternal.n08@gmail.com> |
| Cc: Kees Cook <keescook@chromium.org> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/boot/compressed/Makefile | 2 - |
| arch/x86/tools/calc_run_size.pl | 39 ----------------------------------- |
| arch/x86/tools/calc_run_size.sh | 42 ++++++++++++++++++++++++++++++++++++++ |
| 3 files changed, 43 insertions(+), 40 deletions(-) |
| |
| --- a/arch/x86/boot/compressed/Makefile |
| +++ b/arch/x86/boot/compressed/Makefile |
| @@ -77,7 +77,7 @@ suffix-$(CONFIG_KERNEL_LZO) := lzo |
| suffix-$(CONFIG_KERNEL_LZ4) := lz4 |
| |
| RUN_SIZE = $(shell $(OBJDUMP) -h vmlinux | \ |
| - perl $(srctree)/arch/x86/tools/calc_run_size.pl) |
| + $(CONFIG_SHELL) $(srctree)/arch/x86/tools/calc_run_size.sh) |
| quiet_cmd_mkpiggy = MKPIGGY $@ |
| cmd_mkpiggy = $(obj)/mkpiggy $< $(RUN_SIZE) > $@ || ( rm -f $@ ; false ) |
| |
| --- a/arch/x86/tools/calc_run_size.pl |
| +++ /dev/null |
| @@ -1,39 +0,0 @@ |
| -#!/usr/bin/perl |
| -# |
| -# Calculate the amount of space needed to run the kernel, including room for |
| -# the .bss and .brk sections. |
| -# |
| -# Usage: |
| -# objdump -h a.out | perl calc_run_size.pl |
| -use strict; |
| - |
| -my $mem_size = 0; |
| -my $file_offset = 0; |
| - |
| -my $sections=" *[0-9]+ \.(?:bss|brk) +"; |
| -while (<>) { |
| - if (/^$sections([0-9a-f]+) +(?:[0-9a-f]+ +){2}([0-9a-f]+)/) { |
| - my $size = hex($1); |
| - my $offset = hex($2); |
| - $mem_size += $size; |
| - if ($file_offset == 0) { |
| - $file_offset = $offset; |
| - } elsif ($file_offset != $offset) { |
| - # BFD linker shows the same file offset in ELF. |
| - # Gold linker shows them as consecutive. |
| - next if ($file_offset + $mem_size == $offset + $size); |
| - |
| - printf STDERR "file_offset: 0x%lx\n", $file_offset; |
| - printf STDERR "mem_size: 0x%lx\n", $mem_size; |
| - printf STDERR "offset: 0x%lx\n", $offset; |
| - printf STDERR "size: 0x%lx\n", $size; |
| - |
| - die ".bss and .brk are non-contiguous\n"; |
| - } |
| - } |
| -} |
| - |
| -if ($file_offset == 0) { |
| - die "Never found .bss or .brk file offset\n"; |
| -} |
| -printf("%d\n", $mem_size + $file_offset); |
| --- /dev/null |
| +++ b/arch/x86/tools/calc_run_size.sh |
| @@ -0,0 +1,42 @@ |
| +#!/bin/sh |
| +# |
| +# Calculate the amount of space needed to run the kernel, including room for |
| +# the .bss and .brk sections. |
| +# |
| +# Usage: |
| +# objdump -h a.out | sh calc_run_size.sh |
| + |
| +NUM='\([0-9a-fA-F]*[ \t]*\)' |
| +OUT=$(sed -n 's/^[ \t0-9]*.b[sr][sk][ \t]*'"$NUM$NUM$NUM$NUM"'.*/\1\4/p') |
| +if [ -z "$OUT" ] ; then |
| + echo "Never found .bss or .brk file offset" >&2 |
| + exit 1 |
| +fi |
| + |
| +OUT=$(echo ${OUT# }) |
| +sizeA=$(printf "%d" 0x${OUT%% *}) |
| +OUT=${OUT#* } |
| +offsetA=$(printf "%d" 0x${OUT%% *}) |
| +OUT=${OUT#* } |
| +sizeB=$(printf "%d" 0x${OUT%% *}) |
| +OUT=${OUT#* } |
| +offsetB=$(printf "%d" 0x${OUT%% *}) |
| + |
| +run_size=$(( $offsetA + $sizeA + $sizeB )) |
| + |
| +# BFD linker shows the same file offset in ELF. |
| +if [ "$offsetA" -ne "$offsetB" ] ; then |
| + # Gold linker shows them as consecutive. |
| + endB=$(( $offsetB + $sizeB )) |
| + if [ "$endB" != "$run_size" ] ; then |
| + printf "sizeA: 0x%x\n" $sizeA >&2 |
| + printf "offsetA: 0x%x\n" $offsetA >&2 |
| + printf "sizeB: 0x%x\n" $sizeB >&2 |
| + printf "offsetB: 0x%x\n" $offsetB >&2 |
| + echo ".bss and .brk are non-contiguous" >&2 |
| + exit 1 |
| + fi |
| +fi |
| + |
| +printf "%d\n" $run_size |
| +exit 0 |