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

