ArmVirtPkg/PrePiUniCoreRelocatable CLANG38: work around build issues
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Tue, 11 Dec 2018 12:01:10 +0000 (13:01 +0100)
committerArd Biesheuvel <ard.biesheuvel@linaro.org>
Tue, 11 Dec 2018 16:49:23 +0000 (17:49 +0100)
commite07092edca8442db4a941dbeea0cd196c7bf8ec9
tree226cd612a610e123f2ee6164db3c7e678b763f4b
parentded3c57623b5ddc0045aa3633fd7df0907b6ebd3
ArmVirtPkg/PrePiUniCoreRelocatable CLANG38: work around build issues

The self-relocating PrePi module that is used by the ArmVirtQemuKernel
and ArmVirtXen targets runs the linker in PIE mode so that it emits
dynamic relocations into the final image in a way that permits the
module to relocate itself into place before calling into the C code.

When building these targets using the CLANG38 toolchain, we switch
from the BFD to the GOLD linker, which behaves a bit differently when
building PIE executables, and insists on emitting GOT indirected symbol
references throughout, which means a) that we end up with absolute
addresses (which need to be fixed up at load time) for no good reason,
and b) we have to add support for handling GOT entries to GenFw if we
want to convert them into PE/COFF.

So instead, let's emit a shared library. Since the ELF image only serves
as the input to GenFw, this does not lead to any loss of functionality,
although it does require the -Bsymbolic linker option to be added to
ensure that no symbol based dynamic relocations are emitted (which
would, e.g., permit lazy binding for shared libraries). So for all
other toolchains, the linker option changes are a no-op.

Then, we have to convince CLANG38/GOLD that there is no need to refer
to symbols via a GOT entry. This is done by forcing hidden visibility
for all symbols in all components that make up the PrePi SEC module:
this informs the linker that a symbol is never exported or preempted,
making it safe to refer to it directly from anywhere in the code,
rather than indirectly via a GOT entry.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Acked-by: Laszlo Ersek <lersek@redhat.com>
ArmVirtPkg/ArmVirtQemuKernel.dsc
ArmVirtPkg/ArmVirtXen.dsc
ArmVirtPkg/Include/Platform/Hidden.h [new file with mode: 0644]
ArmVirtPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf