FROMLIST: x86/boot/compressed: Force hidden visibility for all symbol references

Eliminate all GOT entries in the decompressor binary, by forcing hidden
visibility for all symbol references, which informs the compiler that
such references will be resolved at link time without the need for
allocating GOT entries.

To ensure that no GOT entries will creep back in, add an assertion to
the decompressor linker script that will fire if the .got section has
a non-zero size.

[Arvind: fixup -include hidden.h to -include $(srctree)/$(src)/hidden.h]

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Acked-by: Arvind Sankar <nivedita@alum.mit.edu>
Signed-off-by: Arvind Sankar <nivedita@alum.mit.edu>
From: Ard Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20200523120021.34996-3-ardb@kernel.org
Bug: 167402429
Signed-off-by: Alistair Delva <adelva@google.com>
Change-Id: I1e59843c301f3a8fe3f7e4cd7fb6906aa59383b1
This commit is contained in:
Ard Biesheuvel
2020-06-29 10:09:23 -04:00
committed by Alistair Delva
parent 2c1db9ef89
commit c3826e499c
3 changed files with 21 additions and 0 deletions

View File

@@ -43,6 +43,7 @@ KBUILD_CFLAGS += -Wno-pointer-sign
KBUILD_CFLAGS += $(call cc-option,-fmacro-prefix-map=$(srctree)/=)
KBUILD_CFLAGS += -fno-asynchronous-unwind-tables
KBUILD_CFLAGS += -D__DISABLE_EXPORTS
KBUILD_CFLAGS += -include $(srctree)/$(src)/hidden.h
KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__
GCOV_PROFILE := n

View File

@@ -0,0 +1,19 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* When building position independent code with GCC using the -fPIC option,
* (or even the -fPIE one on older versions), it will assume that we are
* building a dynamic object (either a shared library or an executable) that
* may have symbol references that can only be resolved at load time. For a
* variety of reasons (ELF symbol preemption, the CoW footprint of the section
* that is modified by the loader), this results in all references to symbols
* with external linkage to go via entries in the Global Offset Table (GOT),
* which carries absolute addresses which need to be fixed up when the
* executable image is loaded at an offset which is different from its link
* time offset.
*
* Fortunately, there is a way to inform the compiler that such symbol
* references will be satisfied at link time rather than at load time, by
* giving them 'hidden' visibility.
*/
#pragma GCC visibility push(hidden)

View File

@@ -81,6 +81,7 @@ SECTIONS
DISCARDS
}
ASSERT(SIZEOF(.got) == 0, "Unexpected GOT entries detected!")
#ifdef CONFIG_X86_64
ASSERT(SIZEOF(.got.plt) == 0 || SIZEOF(.got.plt) == 0x18, "Unexpected GOT/PLT entries detected!")
#else