Hi Ard, Sorry for my late response. Setting all symbols visibility as hidden will block LTO on GCC. GCC LTO need symbols to be public to let linker freely do the link time optimization across local to external. Below is the GCC5 build failure in my side with your patch.
"gcc" -o /home/jshi19/edk2-fork3/Build/OvmfX64/DEBUG_GCC5/X64/MdeModulePkg/Core/Pei/PeiMain/DEBUG/PeiCore.dll -Os -flto -nostdlib -Wl,-n -Wl,-q -Wl,--gc-sections -z common-page-size=0x40 -Wl,--entry,_ModuleEntryPoint -Wl,-u,_ModuleEntryPoint -Wl,-Map,/home/jshi19/edk2-fork3/Build/OvmfX64/DEBUG_GCC5/X64/MdeModulePkg/Core/Pei/PeiMain/DEBUG/PeiCore.map -mcmodel=small -Wl,-melf_x86_64 -Wl,--oformat=elf64-x86-64 -Wl,--start-group,,@/home/jshi19/edk2-fork3/Build/OvmfX64/DEBUG_GCC5/X64/MdeModulePkg/Core/Pei/PeiMain/OUTPUT/static_library_files.lst -Wl,--end-group -Wl,--defsym=PECOFF_HEADER_SIZE=0x228 -Wl,--script=/home/jshi19/edk2-fork3/BaseTools/Scripts/GccBase.lds "objcopy" /home/jshi19/edk2-fork3/Build/OvmfX64/DEBUG_GCC5/X64/MdeModulePkg/Core/Pei/PeiMain/DEBUG/PeiCore.dll objcopy: error: the input file '/home/jshi19/edk2-fork3/Build/OvmfX64/DEBUG_GCC5/X64/MdeModulePkg/Core/Pei/PeiMain/DEBUG/PeiCore.dll' has no sections make: *** [/home/jshi19/edk2-fork3/Build/OvmfX64/DEBUG_GCC5/X64/MdeModulePkg/Core/Pei/PeiMain/DEBUG/PeiCore.dll] Error 1 GNUmakefile:478: recipe for target '/home/jshi19/edk2-fork3/Build/OvmfX64/DEBUG_GCC5/X64/MdeModulePkg/Core/Pei/PeiMain/DEBUG/PeiCore.dll' failed Steven Shi Intel\SSG\STO\UEFI Firmware Tel: +86 021-61166522 iNet: 821-6522 > -----Original Message----- > From: Ard Biesheuvel [mailto:[email protected]] > Sent: Thursday, July 14, 2016 9:16 PM > To: Shi, Steven <[email protected]>; Zhu, Yonghong > <[email protected]>; Gao, Liming <[email protected]>; Kinney, > Michael D <[email protected]>; Justen, Jordan L > <[email protected]>; [email protected]; [email protected]; edk2- > [email protected] > Cc: Ard Biesheuvel <[email protected]> > Subject: [PATCH 4/5] MdePkg X64: force 'hidden' visibility when building with > -fpic > > When building position independent (PIC) ELF objects, the GCC compiler > assumes that each symbol with external linkage may potentially end up > being exported from a shared library, which means that each of those > symbols may be subject to symbol preemption, i.e., the executable > linking to the shared library at runtime may override symbols exported > by the shared library, and every internal reference held by the shared > library itself *must* be made to point to the overridden version instead. > > For this reason, PIC code symbol references always go via the Global > Offset Table (GOT), even if the code in question references symbols that > are defined in the same compilation unit. The GOT refers to each symbol > by absolute address, and so each entry is subject to runtime relocation. > > Since not every symbol with external linkage is ultimately exported from > a shared library, the GCC compiler allows control over symbol visibility > using attributes, command line arguments and pragmas, where 'hidden' > means that the symbol is only referenced by the shared library itself. > Due to the poor hygiene in EDK2 regarding the use of the 'static' > modifier, many symbols that are local to their compilation unit end up > being referenced indirectly via the GOT when building PIC code. > > In UEFI, there are no shared libraries and so there is no need to deal > with symbol preemption, and we can mark every symbol reference 'hidden'. > The only method that applies to all symbol definitions as well as > declarations is the #pragma. So set the visibility 'hidden' pragma when > building PIC code for X64 using GCC. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Ard Biesheuvel <[email protected]> > --- > MdePkg/Include/X64/ProcessorBind.h | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/MdePkg/Include/X64/ProcessorBind.h > b/MdePkg/Include/X64/ProcessorBind.h > index 705104af062a..96df78fca07d 100644 > --- a/MdePkg/Include/X64/ProcessorBind.h > +++ b/MdePkg/Include/X64/ProcessorBind.h > @@ -27,6 +27,16 @@ > #pragma pack() > #endif > > +#if defined(__GNUC__) && defined(__pic__) > +// > +// Mark all symbol declarations and references as hidden, meaning they will > not > +// be exported from a shared library, and thus will not be subject to symbol > +// preemption. This allows the compiler to refer to symbols directly using > +// relative references rather than via the GOT, which contains absolute > symbol > +// addresses that are subject to runtime relocation. > +// > +#pragma GCC visibility push (hidden) > +#endif > > #if defined(__INTEL_COMPILER) > // > -- > 2.7.4 _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

