> On 16 jul. 2016, at 17:10, Shi, Steven <[email protected]> wrote: > > 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 >
Thanks, I will try it on monday > > > 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

