--- /dev/null
+From 2e7a858ba843d2e6ceab1ba996805411de51b340 Mon Sep 17 00:00:00 2001
+From: Arvind Sankar <nivedita@alum.mit.edu>
+Date: Fri, 31 Jul 2020 16:07:48 -0700
+Subject: x86/boot: Add .text.* to setup.ld
+
+From: Arvind Sankar <nivedita@alum.mit.edu>
+
+commit 2e7a858ba843d2e6ceab1ba996805411de51b340 upstream.
+
+GCC puts the main function into .text.startup when compiled with -Os (or
+-O2). This results in arch/x86/boot/main.c having a .text.startup
+section which is currently not included explicitly in the linker script
+setup.ld in the same directory.
+
+The BFD linker places this orphan section immediately after .text, so
+this still works. However, LLD git, since [1], is choosing to place it
+immediately after the .bstext section instead (this is the first code
+section). This plays havoc with the section layout that setup.elf
+requires to create the setup header, for eg on 64-bit:
+
+ LD arch/x86/boot/setup.elf
+ ld.lld: error: section .text.startup file range overlaps with .header
+ >>> .text.startup range is [0x200040, 0x2001FE]
+ >>> .header range is [0x2001EF, 0x20026B]
+
+ ld.lld: error: section .header file range overlaps with .bsdata
+ >>> .header range is [0x2001EF, 0x20026B]
+ >>> .bsdata range is [0x2001FF, 0x200398]
+
+ ld.lld: error: section .bsdata file range overlaps with .entrytext
+ >>> .bsdata range is [0x2001FF, 0x200398]
+ >>> .entrytext range is [0x20026C, 0x2002D3]
+
+ ld.lld: error: section .text.startup virtual address range overlaps
+ with .header
+ >>> .text.startup range is [0x40, 0x1FE]
+ >>> .header range is [0x1EF, 0x26B]
+
+ ld.lld: error: section .header virtual address range overlaps with
+ .bsdata
+ >>> .header range is [0x1EF, 0x26B]
+ >>> .bsdata range is [0x1FF, 0x398]
+
+ ld.lld: error: section .bsdata virtual address range overlaps with
+ .entrytext
+ >>> .bsdata range is [0x1FF, 0x398]
+ >>> .entrytext range is [0x26C, 0x2D3]
+
+ ld.lld: error: section .text.startup load address range overlaps with
+ .header
+ >>> .text.startup range is [0x40, 0x1FE]
+ >>> .header range is [0x1EF, 0x26B]
+
+ ld.lld: error: section .header load address range overlaps with
+ .bsdata
+ >>> .header range is [0x1EF, 0x26B]
+ >>> .bsdata range is [0x1FF, 0x398]
+
+ ld.lld: error: section .bsdata load address range overlaps with
+ .entrytext
+ >>> .bsdata range is [0x1FF, 0x398]
+ >>> .entrytext range is [0x26C, 0x2D3]
+
+Add .text.* to the .text output section to fix this, and also prevent
+any future surprises if the compiler decides to create other such
+sections.
+
+[1] https://reviews.llvm.org/D75225
+
+Signed-off-by: Arvind Sankar <nivedita@alum.mit.edu>
+Signed-off-by: Kees Cook <keescook@chromium.org>
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Tested-by: Nick Desaulniers <ndesaulniers@google.com>
+Tested-by: Sedat Dilek <sedat.dilek@gmail.com>
+Reviewed-by: Kees Cook <keescook@chromium.org>
+Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
+Reviewed-by: Fangrui Song <maskray@google.com>
+Link: https://lore.kernel.org/r/20200731230820.1742553-5-keescook@chromium.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/x86/boot/setup.ld | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/x86/boot/setup.ld
++++ b/arch/x86/boot/setup.ld
+@@ -20,7 +20,7 @@ SECTIONS
+ .initdata : { *(.initdata) }
+ __end_init = .;
+
+- .text : { *(.text) }
++ .text : { *(.text .text.*) }
+ .text32 : { *(.text32) }
+
+ . = ALIGN(16);