You clone and can try the GCC LTO build on my below branch, and welcome directly debug on it. https://github.com/shijunjing/edk2/tree/llvm_v2
Steven Shi Intel\SSG\STO\UEFI Firmware Tel: +86 021-61166522 iNet: 821-6522 > -----Original Message----- > From: Ard Biesheuvel [mailto:[email protected]] > Sent: Saturday, July 16, 2016 10:48 PM > To: Shi, Steven <[email protected]> > Cc: Zhu, Yonghong <[email protected]>; Gao, Liming > <[email protected]>; Kinney, Michael D <[email protected]>; > Justen, Jordan L <[email protected]>; [email protected]; > [email protected]; [email protected] > Subject: Re: [PATCH 4/5] MdePkg X64: force 'hidden' visibility when building > with -fpic > > On 16 July 2016 at 15:54, Shi, Steven <[email protected]> wrote: > > 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. > > > > Do you have any references that support this? Hidden visibility has > nothing to do with linkage. It only controls the symbols that are > exported from a shared library. Knowing whether a symbol is ever > exported from a shared library allows the compiler to generate better > code. > > > > "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 > > This looks like an issue with --gc-sections. Could you check the map > file why everything gets discarded? > > > 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

