• Ard Biesheuvel's avatar
    efi/libstub/x86: Force 'hidden' visibility for extern declarations · bc7c9d62
    Ard Biesheuvel authored
    Commit c3710de5 ("efi/libstub/x86: Drop __efi_early() export and
    efi_config struct") introduced a reference from C code in eboot.c to
    the startup_32 symbol defined in the .S startup code. This results in
    a GOT based reference to startup_32, and since GOT entries carry
    absolute addresses, they need to be fixed up before they can be used.
    
    On modern toolchains (binutils 2.26 or later), this reference is
    relaxed into a R_386_GOTOFF relocation (or the analogous X86_64 one)
    which never uses the absolute address in the entry, and so we get
    away with not fixing up the GOT table before calling the EFI entry
    point. However, GCC 4.6 combined with a binutils of the era (2.24)
    will produce a true GOT indirected reference, resulting in a wrong
    value to be returned for the address of startup_32() if the boot
    code is not running at the address it was linked at.
    
    Fortunately, we can easily override this behavior, and force GCC to
    emit the GOTOFF relocations explicitly, by setting the visibility
    pragma 'hidden'.
    Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Cc: Arvind Sankar <nivedita@alum.mit.edu>
    Cc: Matthew Garrett <mjg59@google.com>
    Cc: linux-efi@vger.kernel.org
    Link: https://lkml.kernel.org/r/20200103113953.9571-3-ardb@kernel.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    bc7c9d62
eboot.c 22 KB