mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-26 20:44:32 +08:00
d69911a68c
Commit e6023367d7
("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>
43 lines
1.0 KiB
Bash
43 lines
1.0 KiB
Bash
#!/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
|