| From 70b61e362187b5fccac206506d402f3424e3e749 Mon Sep 17 00:00:00 2001 |
| From: Kees Cook <keescook@chromium.org> |
| Date: Mon, 17 Nov 2014 16:16:04 -0800 |
| Subject: x86, kaslr: Handle Gold linker for finding bss/brk |
| |
| From: Kees Cook <keescook@chromium.org> |
| |
| commit 70b61e362187b5fccac206506d402f3424e3e749 upstream. |
| |
| When building with the Gold linker, the .bss and .brk areas of vmlinux |
| are shown as consecutive instead of having the same file offset. Allow |
| for either state, as long as things add up correctly. |
| |
| Fixes: e6023367d779 ("x86, kaslr: Prevent .bss from overlaping initrd") |
| Reported-by: Markus Trippelsdorf <markus@trippelsdorf.de> |
| Signed-off-by: Kees Cook <keescook@chromium.org> |
| Cc: Junjie Mao <eternal.n08@gmail.com> |
| Link: http://lkml.kernel.org/r/20141118001604.GA25045@www.outflux.net |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/tools/calc_run_size.pl | 11 ++++++++++- |
| 1 file changed, 10 insertions(+), 1 deletion(-) |
| |
| --- a/arch/x86/tools/calc_run_size.pl |
| +++ b/arch/x86/tools/calc_run_size.pl |
| @@ -19,7 +19,16 @@ while (<>) { |
| if ($file_offset == 0) { |
| $file_offset = $offset; |
| } elsif ($file_offset != $offset) { |
| - die ".bss and .brk lack common file offset\n"; |
| + # 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"; |
| } |
| } |
| } |