| From 51da9dfb7f20911ae4e79e9b412a9c2d4c373d4b Mon Sep 17 00:00:00 2001 |
| From: Nick Desaulniers <ndesaulniers@google.com> |
| Date: Thu, 4 Jun 2020 16:50:49 -0700 |
| Subject: elfnote: mark all .note sections SHF_ALLOC |
| |
| From: Nick Desaulniers <ndesaulniers@google.com> |
| |
| commit 51da9dfb7f20911ae4e79e9b412a9c2d4c373d4b upstream. |
| |
| ELFNOTE_START allows callers to specify flags for .pushsection assembler |
| directives. All callsites but ELF_NOTE use "a" for SHF_ALLOC. For vdso's |
| that explicitly use ELF_NOTE_START and BUILD_SALT, the same section is |
| specified twice after preprocessing, once with "a" flag, once without. |
| Example: |
| |
| .pushsection .note.Linux, "a", @note ; |
| .pushsection .note.Linux, "", @note ; |
| |
| While GNU as allows this ordering, it warns for the opposite ordering, |
| making these directives position dependent. We'd prefer not to precisely |
| match this behavior in Clang's integrated assembler. Instead, the non |
| __ASSEMBLY__ definition of ELF_NOTE uses |
| __attribute__((section(".note.Linux"))) which is created with SHF_ALLOC, |
| so let's make the __ASSEMBLY__ definition of ELF_NOTE consistent with C |
| and just always use "a" flag. |
| |
| This allows Clang to assemble a working mainline (5.6) kernel via: |
| $ make CC=clang AS=clang |
| |
| Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Reviewed-by: Nathan Chancellor <natechancellor@gmail.com> |
| Reviewed-by: Fangrui Song <maskray@google.com> |
| Cc: Jeremy Fitzhardinge <jeremy@goop.org> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Vincenzo Frascino <vincenzo.frascino@arm.com> |
| Link: https://github.com/ClangBuiltLinux/linux/issues/913 |
| Link: http://lkml.kernel.org/r/20200325231250.99205-1-ndesaulniers@google.com |
| Debugged-by: Ilie Halip <ilie.halip@gmail.com> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Jian Cai <jiancai@google.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| include/linux/elfnote.h | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/include/linux/elfnote.h |
| +++ b/include/linux/elfnote.h |
| @@ -54,7 +54,7 @@ |
| .popsection ; |
| |
| #define ELFNOTE(name, type, desc) \ |
| - ELFNOTE_START(name, type, "") \ |
| + ELFNOTE_START(name, type, "a") \ |
| desc ; \ |
| ELFNOTE_END |
| |