> On Jun 17, 2015, at 3:01 PM, Cohen, Eugene <eug...@hp.com> wrote:
> 
> Thanks for the great feedback -- you made me do more homework than I was 
> expecting which is not a bad thing.
> 
> Since we understand the problem and the fix, I think it's time to get 
> Olivier's review and approval to move forward.
> 

Eugene,

One question. Does this make the minimum PEIM size > 64K?

The original reason for the 32 byte alignment in the PE/COFF images was to make 
PEIMs smaller, the default is 4K alignment for sections. 

Thanks,

Andrew Fish

> Thanks,
> 
> Eugene
> 
> -----Original Message-----
> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org] 
> Sent: Tuesday, June 16, 2015 2:51 PM
> To: edk2-devel@lists.sourceforge.net; Olivier Martin
> Subject: Re: [edk2] [PATCH] BaseTools for AArch64 GCC: Ensure that the 
> correlation .text and .data is consistent between ELF and PE-COFF so the 
> debugger sees global variables correctly
> 
> On 16 June 2015 at 22:32, Cohen, Eugene <eug...@hp.com> wrote:
>>> OK. so does that mean we are using a builtin linker script for
>>> AArch64? That sounds fragile to me ...
>> 
>> Apparently we are using the builtin script.  I learned that this can be 
>> queried with the -verbose switch for ld and have attached it.  It includes 
>> this interesting alignment mechanism:
>> 
>>  /* Adjust the address for the data segment.  We want to adjust up to
>>       the same address within the page on the next page up.  */
>>    . = ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1));
>> 
>> MAXPAGESIZE doesn't appear to be well documented but I can see patches to ld 
>> that show this being increased to 64KB which is consistent with my objdump 
>> output before the change.  So I think this is the "offending" line in the 
>> original script since it shifted data out in ELF even though the PE-COFF 
>> converter packed it tightly, accounting for the section alignment 
>> requirements from ELF.
>> 
>>> Could you please look at the X64 approach, and compare it to yours?
>> 
>> It's really a question for the developer originating -Ttext=0x0 - maybe 
>> Olivier?  I don't have the history on how the GCC linker configuration for 
>> edk2 came to be.
>> 
>>> Perhaps you could share some numbers or other details to get a feel
>>> for what exactly goes on here.
>> 
>> I think I described in this in my email titled " AArch64 Debugger Global 
>> Variable Correlation Issues" - I gave the ELF dump showing data shifted out 
>> by 64KB.  Strangely, this was shifted out not to the next 64KB aligned 
>> boundary but to 0x10000 beyond the last .test/.rodata section - I'm not sure 
>> why but perhaps somebody with more GNU ld experience can figure out why.
>> 
> 
> That is *precisely* what the expression above aims to achieve. It
> wants to preserve the relative alignment of all the sections, but make
> sure that there is a 64 KB aligned boundary in between so that the two
> regions can always be mapped with different permissions even on a 64K
> pagesize OS. I.e., the expression aligns to the next boundary, and
> then adds the unaligned fraction of ".", which effectively just adds
> MAXPAGESIZE unless "." is already 64K aligned (if I am not mistaken).
> This matches your observation, right?
> 
> I assume MAXPAGESIZE is a build time constant for ld, so there is not
> a lot of wiggle room here unless we switch to a custom linker script.
> 
> -- 
> Ard.
> 
> 
> 
> 
>> -----Original Message-----
>> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
>> Sent: Tuesday, June 16, 2015 9:21 AM
>> To: edk2-devel@lists.sourceforge.net
>> Subject: Re: [edk2] [PATCH] BaseTools for AArch64 GCC: Ensure that the 
>> correlation .text and .data is consistent between ELF and PE-COFF so the 
>> debugger sees global variables correctly
>> 
>> On 16 June 2015 at 16:50, Cohen, Eugene <eug...@hp.com> wrote:
>>>> Could you please send patches inline? Attachments are a pain to review.
>>> 
>>> Sure, I will do that.  Because I use Outlook I prefer the attachment since 
>>> I can pull it into a nice patch viewer.
>>> 
>> 
>> I can see how that would be preferred for just viewing, but for
>> commenting inline it is far from optimal.
>> 
>>>> Applying your patch and doing 'git show --find-copies-harder' gives me 
>>>> (tools_def.tempate omitted):
>>> 
>>> Unfortunately git found a copy that is not appropriate for comparison.  It 
>>> found the X86/X64 linker script that, while similar, is different than what 
>>> we were already doing for AArch64.  (I'm not saying the X86 approach 
>>> doesn't work but my goal here was to minimize the impact to what was 
>>> already being done for AArch64.)
>>> 
>> 
>> OK. so does that mean we are using a builtin linker script for
>> AArch64? That sounds fragile to me ...
>> Could you please look at the X64 approach, and compare it to yours?
>> Personally, I'd prefer to stay as close as possible to what is being
>> done on Intel, for obvious reasons ...
>> 
>> 
>>> On AArch64 the .text section was being placed with this linker switch:
>>> 
>>>  -Ttext=0x0
>>> 
>>> But this was not sufficient to pack the .data section in a manner that is 
>>> consistent with the PE-COFF conversion that happens later in the build.  So 
>>> when I converted this to a linker control file, I maintained the zero 
>>> starting address with:
>>> 
>>>  . = 0;
>>> 
>> 
>> OK, that parts seems obvious. So how is the packing of the .data
>> section being affected by your version of the linker script?
>> Perhaps you could share some numbers or other details to get a feel
>> for what exactly goes on here.
>> 
>>>> So are you saying that the resulting PE/COFF is identical (for all
>>>> intents and purposes), and only the ELF intermediate file deviates?
>>> 
>>> Yes, from my testing the PE/COFF looks the same but the ELF is updated to 
>>> move .data such that its offset relative to .text is consistent with 
>>> PE/COFF.  This fixes debugger correlation for stuff in the .data section 
>>> like global variables.
>>> 
>>>> How does this affect
>>>> ArmPkg/Library/DebugPeCoffExtraActionLib/DebugPeCoffExtraActionLib.inf,
>>>> which outputs lines like
>>> 
>>>> From my testing it has no effect since this output is only outputting the 
>>>> PE-COFF image address offset by the size of the PE-COFF headers (0x260 in 
>>>> this case):
>>> 
>>>  (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders))
>>> 
>>> The reason the SizeOfHeaders is added is because the debugger is unaware of 
>>> the PE-COFF conversion and added executable headers.
>>> 
>> 
>> OK, that makes sense.
>> 
>>> -----Original Message-----
>>> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
>>> Sent: Tuesday, June 16, 2015 5:56 AM
>>> To: edk2-devel@lists.sourceforge.net
>>> Subject: Re: [edk2] [PATCH] BaseTools for AArch64 GCC: Ensure that the 
>>> correlation .text and .data is consistent between ELF and PE-COFF so the 
>>> debugger sees global variables correctly
>>> 
>>> On 4 June 2015 at 21:48, Cohen, Eugene <eug...@hp.com> wrote:
>>>> Oops, left off the contribution agreement line, trying again
>>>> 
>>>> Dear ArmPkg maintainers (and later BaseTools maintainer),
>>>> 
>>>> This is a fix for debugger correlation of global variables for AArch64 
>>>> built on GCC.
>>>> 
>>>> Before this change looking at global variables with a debugger showed 
>>>> bogus memory locations. This is because the offset of the .data section in 
>>>> the ELF file did not reflect where it was placed in the PE-COFF (.efi) 
>>>> output.
>>>> 
>>>> This change passes a linker control script so that the data section is 
>>>> packed next to .text so the ELF accurately reflects the relationship 
>>>> between the sections when converted to PE-COFF by GenFw.
>>>> 
>>>> I have tested this with the Lauterbach debugger.  I don't know how well it 
>>>> will work with other debuggers and debug scripts.
>>>> 
>>>> If you would rather view the change as a github pull request:
>>>> https://github.com/tianocore/edk2/pull/12
>>>> 
>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>> Signed-off-by: Eugene Cohen <eug...@hp.com>
>>>> 
>>> 
>>> Could you please send patches inline? Attachments are a pain to review.
>>> 
>>> Also, since the patch introduces a completely new linker script, it is
>>> hard to review how yours deviates from the default.
>>> Git is actually quite helpful since it can figure out if your newly
>>> introduced file resembles an existing file, and only shows the diff
>>> with respect to the original.
>>> 
>>> Applying your patch and doing 'git show --find-copies-harder' gives me
>>> (tools_def.tempate omitted):
>>> 
>>> """
>>> diff --git a/BaseTools/Scripts/gcc4.4-ld-script
>>> b/BaseTools/Scripts/gcc-arm-ld-script
>>> similarity index 59%
>>> copy from BaseTools/Scripts/gcc4.4-ld-script
>>> copy to BaseTools/Scripts/gcc-arm-ld-script
>>> index 68b2767590ac..e1589a4d03bf 100644
>>> --- a/BaseTools/Scripts/gcc4.4-ld-script
>>> +++ b/BaseTools/Scripts/gcc-arm-ld-script
>>> @@ -1,8 +1,10 @@
>>> -/* OUTPUT_FORMAT(efi-bsdrv-x86_64) */
>>> SECTIONS
>>> {
>>> -  /* . = 0 + SIZEOF_HEADERS; */
>>> -  . = 0x280;
>>> +  /* Start at 0 so we can meet more aggressive alignment requires
>>> after the PE-COFF conversion
>>> +     like those for ARM exception vectors.  This requires debugger
>>> scripts to offset past
>>> +     the PE-COFF header (typically 0x260).  When the PE-COFF
>>> conversion occurs we will
>>> +     get proper alignment since the ELF section alignment is applied
>>> in the conversion process. */
>>> +  . = 0;
>>>   .text ALIGN(0x20) :
>>>   {
>>>     *(.text .stub .text.* .gnu.linkonce.t.*)
>>> """
>>> 
>>> So are you saying that the resulting PE/COFF is identical (for all
>>> intents and purposes), and only the ELF intermediate file deviates?
>>> How does this affect
>>> ArmPkg/Library/DebugPeCoffExtraActionLib/DebugPeCoffExtraActionLib.inf,
>>> which outputs lines like
>>> 
>>> add-symbol-file
>>> /home/ard/build/uefi-next/Build/ArmVirtQemu-AARCH64/DEBUG_GCC48/AARCH64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll
>>> 0x5F2C7260
>>> 
>>> where the .dll is and ELF file, and the line seems to incorporate the
>>> header offset that you are removing.
>>> 
>>> Regards,
>>> Ard.
>>> 
>>> ------------------------------------------------------------------------------
>>> _______________________________________________
>>> edk2-devel mailing list
>>> edk2-devel@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>>> 
>>> ------------------------------------------------------------------------------
>>> _______________________________________________
>>> edk2-devel mailing list
>>> edk2-devel@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>> 
>> ------------------------------------------------------------------------------
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>> 
>> ------------------------------------------------------------------------------
>> 
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>> 
> 
> ------------------------------------------------------------------------------
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
> 
> ------------------------------------------------------------------------------
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel


------------------------------------------------------------------------------
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to