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

Reply via email to