On Tue, 11 Dec 2018 at 13:57, Leif Lindholm <leif.lindh...@linaro.org> wrote: > > Not my package, but a couple of minor style/language comments below > (because this is awkward enough any future readers/users will need all > the help they can get). > > On Tue, Dec 11, 2018 at 01:19:36PM +0100, Ard Biesheuvel wrote: > > 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.biesheu...@linaro.org> > > --- > > ArmVirtPkg/ArmVirtQemuKernel.dsc | 12 ++++++++-- > > ArmVirtPkg/ArmVirtXen.dsc | 12 ++++++++-- > > ArmVirtPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf | 2 +- > > ArmVirtPkg/Include/Platform/Hidden.h | 23 > > ++++++++++++++++++++ > > 4 files changed, 44 insertions(+), 5 deletions(-) > > > > diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc > > b/ArmVirtPkg/ArmVirtQemuKernel.dsc > > index 9928919bf5b0..c4324a9e264b 100644 > > --- a/ArmVirtPkg/ArmVirtQemuKernel.dsc > > +++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc > > @@ -68,11 +68,19 @@ [LibraryClasses.common] > > [LibraryClasses.common.UEFI_DRIVER] > > UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf > > > > -[BuildOptions.ARM.EDKII.SEC, BuildOptions.ARM.EDKII.BASE] > > +[BuildOptions.common.EDKII.SEC, BuildOptions.common.EDKII.BASE] > > # Avoid MOVT/MOVW instruction pairs in code that may end up in the PIE > > # executable we build for the relocatable PrePi. They are not runtime > > # relocatable in ELF. > > - *_CLANG35_*_CC_FLAGS = -mno-movt > > + *_CLANG35_ARM_CC_FLAGS = -mno-movt > > + > > + # > > + # CLANG38 with LTO support enabled uses the GNU GOLD linker, which > > insists > > + # on emitting GOT based symbol references when running in shared mode, > > unless > > + # we override visibility to 'hidden' in all modules that make up the > > PrePi > > + # build. > > + # > > + GCC:*_CLANG38_*_CC_FLAGS = -include > > $(WORKSPACE)/ArmVirtPkg/Include/Platform/Hidden.h > > > > > > ################################################################################ > > # > > diff --git a/ArmVirtPkg/ArmVirtXen.dsc b/ArmVirtPkg/ArmVirtXen.dsc > > index 20fae9e675bb..e083666f54ea 100644 > > --- a/ArmVirtPkg/ArmVirtXen.dsc > > +++ b/ArmVirtPkg/ArmVirtXen.dsc > > @@ -57,11 +57,19 @@ [LibraryClasses] > > [LibraryClasses.common.UEFI_DRIVER] > > UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf > > > > -[BuildOptions.ARM.EDKII.SEC, BuildOptions.ARM.EDKII.BASE] > > +[BuildOptions.common.EDKII.SEC, BuildOptions.common.EDKII.BASE] > > # Avoid MOVT/MOVW instruction pairs in code that may end up in the PIE > > # executable we build for the relocatable PrePi. They are not runtime > > # relocatable in ELF. > > - *_CLANG35_*_CC_FLAGS = -mno-movt > > + *_CLANG35_ARM_CC_FLAGS = -mno-movt > > + > > + # > > + # CLANG38 with LTO support enabled uses the GNU GOLD linker, which > > insists > > + # on emitting GOT based symbol references when running in shared mode, > > unless > > + # we override visibility to 'hidden' in all modules that make up the > > PrePi > > + # build. > > + # > > + GCC:*_CLANG38_*_CC_FLAGS = -include > > $(WORKSPACE)/ArmVirtPkg/Include/Platform/Hidden.h > > > > > > ################################################################################ > > # > > diff --git a/ArmVirtPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf > > b/ArmVirtPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf > > index 034ddb41cb48..5fe6cd8eb481 100755 > > --- a/ArmVirtPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf > > +++ b/ArmVirtPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf > > @@ -105,4 +105,4 @@ [Pcd] > > gArmTokenSpaceGuid.PcdFvBaseAddress > > > > [BuildOptions] > > - GCC:*_*_*_DLINK_FLAGS = -pie -Wl,-T,$(MODULE_DIR)/Scripts/PrePi-PIE.lds > > + GCC:*_*_*_DLINK_FLAGS = -shared -Wl,-Bsymbolic > > -Wl,-T,$(MODULE_DIR)/Scripts/PrePi-PIE.lds > > diff --git a/ArmVirtPkg/Include/Platform/Hidden.h > > b/ArmVirtPkg/Include/Platform/Hidden.h > > new file mode 100644 > > index 000000000000..20e9f5d896b2 > > --- /dev/null > > +++ b/ArmVirtPkg/Include/Platform/Hidden.h > > @@ -0,0 +1,23 @@ > > +/** @file > > + > > + Copyright (c) 2018, Linaro Limited. All rights reserved. > > + > > + This program and the accompanying materials > > + are licensed and made available under the terms and conditions of the > > BSD License > > + which accompanies this distribution. The full text of the license may > > be found at > > + http://opensource.org/licenses/bsd-license.php > > + > > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR > > IMPLIED. > > + > > +**/ > > + > > I know this isn't intended to be explicitly included, but could we > still have in include guard? >
Sure. > > +// > > +// Setting the GCC -fvisibility=hidden command line option is not quite > > the same > > +// as setting the pragma below: the former only affects definitions, > > whereas the > > +// latter affects extern declarations as well. So if we want to ensure > > that no > > s/latter/pragma/? (Just saves on recursive natural language parsing > Fair enough. _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel