Ard: I will verify it. And, I would ask why only X64 requires it? IA32, ARM and AARCH64 doesn't specially handle it?
Thanks Liming > -----Original Message----- > From: Ard Biesheuvel [mailto:[email protected]] > Sent: Tuesday, August 02, 2016 12:12 AM > To: Gao, Liming <[email protected]> > Cc: Shi, Steven <[email protected]>; Zhu, Yonghong > <[email protected]>; Justen, Jordan L <[email protected]>; > [email protected]; [email protected]; [email protected] > Subject: Re: [edk2] [PATCH v5 7/8] MdePkg GCC/X64: avoid 'hidden' visibility > for module entry points > > On 1 August 2016 at 17:51, Ard Biesheuvel <[email protected]> > wrote: > > On 1 August 2016 at 16:56, Ard Biesheuvel <[email protected]> > wrote: > >> On 1 August 2016 at 16:49, Ard Biesheuvel <[email protected]> > wrote: > >>> On 1 August 2016 at 16:18, Gao, Liming <[email protected]> wrote: > >>>> Ard: > >>>> I don't think it is good way to define GCC_VISIBILITY_PROTECTED and > apply it in EntryPointLib. We only need to expose _ModuleEntryPoint. It has > been specified in LINK_FLAGS in tools_def.txt. Could we also specify its > attribute in CC_FLAGS or LINK_FLAGS in tools_def.txt? > >>>> > >>> > >>> It seems this does the trick as well > >>> > >>> diff --git a/BaseTools/Scripts/GccBase.lds > b/BaseTools/Scripts/GccBase.lds > >>> index 281af8a9bd33..02387d4f8d6f 100644 > >>> --- a/BaseTools/Scripts/GccBase.lds > >>> +++ b/BaseTools/Scripts/GccBase.lds > >>> @@ -80,3 +80,7 @@ SECTIONS { > >>> *(COMMON) > >>> } > >>> } > >>> + > >>> +VERSION { > >>> + { global: _ModuleEntryPoint*; }; > >>> +}; > >>> > >>> > >>> Note that * at the end: this is necessary since _ModuleEntryPoint will > >>> be called _ModuleEntryPoint.lto_priv.xxx in the LTO objects. > >>> > >> > >> Hmm, looks like I spoke too soon. I don't know what I did wrong, but > >> this does not actually work. > >> > > > > The only alternative I can think of is to add a static non-lto object > > to the tree that refers to _ModuleEntryPoint, similar to the way I > > handle the ARM intrinsics in patch #5 > > > > As it turns out, the LTO linker does not need to visibility pragma to > prevent it from emitting GOT based relocations. This makes sense, > considering that the LTO linker can see that no symbol references are > ever satisfied across dynamic object boundaries. That means I could > work around this in the following way: > > diff --git a/BaseTools/Conf/tools_def.template > b/BaseTools/Conf/tools_def.template > index 314adaf6bfa8..983e2fea7390 100644 > --- a/BaseTools/Conf/tools_def.template > +++ b/BaseTools/Conf/tools_def.template > @@ -4462,7 +4462,7 @@ DEFINE GCC49_ARM_ASLDLINK_FLAGS = > DEF(GCC48_ARM_ASLDLINK_FLAGS) > DEFINE GCC49_AARCH64_ASLDLINK_FLAGS = > DEF(GCC48_AARCH64_ASLDLINK_FLAGS) > > DEFINE GCC5_IA32_CC_FLAGS = DEF(GCC49_IA32_CC_FLAGS) -flto > -fno-builtin > -DEFINE GCC5_X64_CC_FLAGS = DEF(GCC49_X64_CC_FLAGS) -flto > -fno-builtin > +DEFINE GCC5_X64_CC_FLAGS = DEF(GCC49_X64_CC_FLAGS) -flto > -fno-builtin -DUSING_LTO > DEFINE GCC5_IA32_X64_DLINK_COMMON = > DEF(GCC49_IA32_X64_DLINK_COMMON) > DEFINE GCC5_IA32_X64_ASLDLINK_FLAGS = > DEF(GCC49_IA32_X64_ASLDLINK_FLAGS) > DEFINE GCC5_IA32_X64_DLINK_FLAGS = > DEF(GCC49_IA32_X64_DLINK_FLAGS) -flto > diff --git a/MdePkg/Include/X64/ProcessorBind.h > b/MdePkg/Include/X64/ProcessorBind.h > index 666cc8e8bd16..77fab7055afc 100644 > --- a/MdePkg/Include/X64/ProcessorBind.h > +++ b/MdePkg/Include/X64/ProcessorBind.h > @@ -27,12 +27,15 @@ > #pragma pack() > #endif > > -#if defined(__GNUC__) && defined(__pic__) > +#if defined(__GNUC__) && defined(__pic__) && !defined(USING_LTO) > // > // Mark all symbol declarations and references as hidden, meaning they 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. > +// The LTO linker will not emit GOT based relocations anyway, so there is no > +// need to set the pragma in that case (and doing so will cause issues of its > +// own) > // > #pragma GCC visibility push (hidden) > #endif > > and I can drop this patch. _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

