|
@@ -31,6 +31,34 @@
|
|
|
#include <asm/asm-offsets.h>
|
|
|
#include <asm/bootparam.h>
|
|
|
|
|
|
+/*
|
|
|
+ * The 32-bit x86 assembler in binutils 2.26 will generate R_386_GOT32X
|
|
|
+ * relocation to get the symbol address in PIC. When the compressed x86
|
|
|
+ * kernel isn't built as PIC, the linker optimizes R_386_GOT32X
|
|
|
+ * relocations to their fixed symbol addresses. However, when the
|
|
|
+ * compressed x86 kernel is loaded at a different address, it leads
|
|
|
+ * to the following load failure:
|
|
|
+ *
|
|
|
+ * Failed to allocate space for phdrs
|
|
|
+ *
|
|
|
+ * during the decompression stage.
|
|
|
+ *
|
|
|
+ * If the compressed x86 kernel is relocatable at run-time, it should be
|
|
|
+ * compiled with -fPIE, instead of -fPIC, if possible and should be built as
|
|
|
+ * Position Independent Executable (PIE) so that linker won't optimize
|
|
|
+ * R_386_GOT32X relocation to its fixed symbol address. Older
|
|
|
+ * linkers generate R_386_32 relocations against locally defined symbols,
|
|
|
+ * _bss, _ebss, _got and _egot, in PIE. It isn't wrong, just less
|
|
|
+ * optimal than R_386_RELATIVE. But the x86 kernel fails to properly handle
|
|
|
+ * R_386_32 relocations when relocating the kernel. To generate
|
|
|
+ * R_386_RELATIVE relocations, we mark _bss, _ebss, _got and _egot as
|
|
|
+ * hidden:
|
|
|
+ */
|
|
|
+ .hidden _bss
|
|
|
+ .hidden _ebss
|
|
|
+ .hidden _got
|
|
|
+ .hidden _egot
|
|
|
+
|
|
|
__HEAD
|
|
|
ENTRY(startup_32)
|
|
|
#ifdef CONFIG_EFI_STUB
|